Трассировка вызова в java

Есть ли способ вывода трассировки вызова для конкретного потока в java?

Мне не нужна трассировка стека. Мне нужна последовательность вызовов для каждого объекта для трассировки.

Ответы

Ответ 1

Существует btrace, который можно использовать для такого рода действий.

Ответ 2

Я думаю, вы можете найти это интересным. Это агент Java, который добавляет входные и выходные протоколы к методам, используя инфраструктуру slf4j, чтобы фактически регистрировать вывод. Затем необходимо настроить структуру ведения журнала, чтобы распечатать только тот поток, который вас интересует.

http://www.slf4j.org/extensions.html#javaagent

(просто чтобы быть явным: 1) Я написал его, 2) он работает для меня:))

Ответ 3

Если вы хотите отслеживать выполнение кода Java, вы можете использовать инструмент InTrace.

ПРИМЕЧАНИЕ. InTrace - это бесплатный инструмент с открытым исходным кодом, который я написал.

Ответ 4

В основном вы хотите, чтобы аспектно-ориентированное программирование какой-то формы, где аспект мог определить, должен ли текущий поток быть зарегистрированным вызовом. (Альтернатива заключается в том, чтобы явно вносить журнал в каждый метод самостоятельно, что было бы болезненно.)

В Java существует множество инфраструктур AOP, таких как AspectJ и Spring (Spring, конечно, намного больше, чем AOP).

Применение аспектов к каждому вызову метода в системе может быть сложным, хотя... У меня нет опыта с AspectJ, но Spring AOP в основном предназначен для включения AOP в компоненты. Классы, которые фактически неизвестны Spring, не могут быть легко изменены. Имейте в виду, что прошло некоторое время с тех пор, как я использовал даже Spring AOP - с тех пор все возможно:)

Ответ 5

Мы могли бы создать новый объект Throwable, который будет иметь трассировку вызова. И используя некоторые строковые манипуляции, мы можем получить стек вызовов.

Throwable t = new Throwable();
System.out.println(t.getStackTrace()[1].toString());

Я не уверен, что получить эту информацию, это хорошая практика или нет.:)

Ответ 6

Runtime.traceMethodCalls(), который печатает строку для каждого вызова метода для всех объектов во всех потоках

Ответ 7

Чем проще, чем Btrace использует HouseMD, вы можете получить от здесь