Программный дамп потока / JDI (интерфейс отладчика Java)

StackOverflow https://stackoverflow.com/questions/239544

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

    Это было полезно?

    Решение

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

    дамп thead с 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 () выводит только трассировку выполнения всех потоков, но не предоставляет информацию о блокировках объекта, которые были получены конкретным потоком, или о блокировке, которую ожидал конкретный поток. По сути, мы не сможем завести это в тупик.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top