Программный дамп потока / JDI (интерфейс отладчика Java) - PullRequest
7 голосов
/ 27 октября 2008

Мне нравится генерировать дамп потока программно. Я узнал, что есть два основных способа сделать это:

  1. Используйте «Java Tool Machine Interface» JVM-TI
  2. Используйте более обобщенный JDI

Для JVM-TI мне удалось найти некоторую полезную информацию, но мне пришлось бы написать JNI-DLL, которой, по крайней мере, на данный момент, я бы хотел избежать. С JDI я могу использовать Java, и кажется, что я могу использовать его из приложения. Но я не смог найти какой-то учебник или HOWTO для него. Единственной документацией, которую я смог найти, были Java-Docs http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/, которые не очень полезны, потому что не показывают мне, как использовать эти классы.

Итак, кто-нибудь знает хороший учебник / книгу, которую я мог бы прочитать?

Спасибо за любую помощь!

Ответы [ 4 ]

21 голосов
/ 27 октября 2008

Существует третий способ: Thread.getAllStackTraces ()

http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#getAllStackTraces()

Это намного проще, чем интерфейс отладчика ...

8 голосов
/ 27 марта 2009

Вы можете получить практически всю необходимую информацию о потоке, включая взаимоблокировки, от http://java.sun.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

3 голосов
/ 31 октября 2008

Thread.getAllStackTraces () выводит только трассировку выполнения всех потоков, но не предоставляет информацию о блокировках объектов, которые были получены конкретным потоком, или о блокировке, которую ожидал конкретный поток. По сути, с этим мы не сможем завести тупики.

1 голос
/ 27 октября 2008

Рассматривали ли вы удаленную альтернативу? То есть VisualVM

thead dump with visualVM

jps и jstack также являются полезными инструментами, включенными в JDK 5, обеспечивая быстрый метод командной строки для получения трассировки стека всех текущих потоков.

Эта статья предполагает, что JDI также используется в качестве удаленного инструмента .

Так что я не уверен, что вы можете запустить дамп потока в своей собственной программе, вместо этого вы найдете способ отправить себе сигнал SIGQUIT (kill -3) на платформах Unix или нажать клавишу Ctrl- \ на Unix или Ctrl-Break на платформах Windows.

Плюс, JDI не предназначался для отладки того же процесса, в котором работает клиент JDI . Тем не менее, эта ветка, с которой я только что связался, является наиболее близкой к использованию JDI в той же программе.

...