Программный дамп потока / JDI (интерфейс отладчика Java)
-
04-07-2019 - |
Вопрос
Мне нравится генерировать дамп потока программно. Я узнал, что есть два основных способа сделать это:
<Ол>Для JVM-TI мне удалось найти некоторую полезную информацию, но мне пришлось бы написать JNI-DLL, которой, по крайней мере, на данный момент, я бы хотел избежать. С JDI я могу использовать Java, и кажется, что я могу использовать его из приложения. Но я не смог найти какой-то учебник или HOWTO для него. Единственной документацией, которую я мог найти, были Java-документы http: //java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/ , что не очень полезно, потому что не показывает мне, как использовать эти классы.
Итак, кто-нибудь знает хороший учебник / книгу, которую я мог бы прочитать?
Спасибо за любую помощь!
Решение
Рассматривали ли вы удаленную альтернативу? То есть VisualVM
jps и jstack также являются полезными инструментами, включенными в JDK 5, обеспечивая быстрый метод командной строки для получение следов стека всех текущих потоков. Р>
В этой статье предполагается, что JDI также используется как удаленный инструмент .
Так что я не уверен, что вы можете запустить дамп потока в своей собственной программе, вместо этого вы найдете способ отправить себе сигнал SIGQUIT (kill -3) на платформах Unix или нажать клавишу Ctrl- \ на Unix или Ctrl-Break на платформах Windows.
Кроме того, JDI не предназначался для отладки того же процесса. в котором работает клиент JDI . Тем не менее, эта ветка, с которой я только что связался, является наиболее близкой к использованию JDI в той же программе.
Другие советы
Существует третий способ: Thread.getAllStackTraces ()
http: // java. sun.com/javase/6/docs/api/java/lang/Thread.html#getAllStackTraces ()
Это намного проще, чем интерфейс отладчика ...
Вы можете получить практически всю необходимую информацию о потоках, включая взаимоблокировки, из http://java.sun.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html р>
Thread.getAllStackTraces () выводит только трассировку выполнения всех потоков, но не предоставляет информацию о блокировках объекта, которые были получены конкретным потоком, или о блокировке, которую ожидал конкретный поток. По сути, мы не сможем завести это в тупик.