Ответ 1
Существует btrace, который можно использовать для такого рода действий.
Есть ли способ вывода трассировки вызова для конкретного потока в java?
Мне не нужна трассировка стека. Мне нужна последовательность вызовов для каждого объекта для трассировки.
Существует btrace, который можно использовать для такого рода действий.
Я думаю, вы можете найти это интересным. Это агент Java, который добавляет входные и выходные протоколы к методам, используя инфраструктуру slf4j, чтобы фактически регистрировать вывод. Затем необходимо настроить структуру ведения журнала, чтобы распечатать только тот поток, который вас интересует.
http://www.slf4j.org/extensions.html#javaagent
(просто чтобы быть явным: 1) Я написал его, 2) он работает для меня:))
Если вы хотите отслеживать выполнение кода Java, вы можете использовать инструмент InTrace.
ПРИМЕЧАНИЕ. InTrace - это бесплатный инструмент с открытым исходным кодом, который я написал.
В основном вы хотите, чтобы аспектно-ориентированное программирование какой-то формы, где аспект мог определить, должен ли текущий поток быть зарегистрированным вызовом. (Альтернатива заключается в том, чтобы явно вносить журнал в каждый метод самостоятельно, что было бы болезненно.)
В Java существует множество инфраструктур AOP, таких как AspectJ и Spring (Spring, конечно, намного больше, чем AOP).
Применение аспектов к каждому вызову метода в системе может быть сложным, хотя... У меня нет опыта с AspectJ, но Spring AOP в основном предназначен для включения AOP в компоненты. Классы, которые фактически неизвестны Spring, не могут быть легко изменены. Имейте в виду, что прошло некоторое время с тех пор, как я использовал даже Spring AOP - с тех пор все возможно:)
Мы могли бы создать новый объект Throwable, который будет иметь трассировку вызова. И используя некоторые строковые манипуляции, мы можем получить стек вызовов.
Throwable t = new Throwable();
System.out.println(t.getStackTrace()[1].toString());
Я не уверен, что получить эту информацию, это хорошая практика или нет.:)
Runtime.traceMethodCalls()
, который печатает строку для каждого вызова метода для всех объектов во всех потоках
Чем проще, чем Btrace использует HouseMD, вы можете получить от здесь
Если вы используете IntelliJ, есть плагин под названием Flameviewer. Пожалуйста, найдите более подробную информацию по ссылке ниже,
https://github.com/kornilova-l/FlameViewer#uploading-file-to-flameviewer