Вызов трассировки в Java - PullRequest
16 голосов
/ 22 июня 2009

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

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

Ответы [ 7 ]

13 голосов
/ 22 июня 2009

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

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

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

11 голосов
/ 07 февраля 2011

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

4 голосов
/ 19 июня 2011

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

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

2 голосов
/ 22 июня 2009

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

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

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

2 голосов
/ 22 июня 2009

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

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

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

1 голос
/ 24 июня 2012

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

1 голос
/ 22 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...