дамп стека Java на окнах - PullRequest
       18

дамп стека Java на окнах

22 голосов
/ 23 января 2010

У меня запущенный Java-процесс в стандартном командном окне Windows. то есть я запустил 'cmd' и набрал в java -jar ...

Мне нужно иметь возможность получить полный дамп стека всех потоков, если это вообще возможно.

Я помню, что в Linux вы можете отправить сообщение в JVM через опцию команды quit.

в этот документ солнечное государство

Для генерации трассировки стека в Windows 95 или Windows NT, введите последовательность клавиш в окно, где находится программа Java или нажмите кнопку Закрыть на окно.

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

Ответы [ 7 ]

36 голосов
/ 24 января 2010

Вы можете использовать jstack [ option ] pid (если речь идет о дампе потока). Используйте jps, чтобы найти идентификатор вашего Java-процесса.

18 голосов
/ 23 января 2010

Ввод Ctrl + Перерыв - это правильный способ создания дампа потока в Windows.

Вы нажимаете Ctrl + C (= прерывание), может быть? Это отправит SIGINT, который, как правило, убьет ваш процесс.

5 голосов
/ 24 января 2010

В Java 6 JDK + исполняемый файл jvisualvm позволяет подключаться к работающей программе (дважды щелкните по ее записи в левой части).

Когда прикреплено, справа находится панель Threads, на которой есть кнопка Thread Dump.

Это дает вам дамп потока.

После создания вы можете A) Выбрать все - Скопировать и вставить дамп потока в текстовый редактор. или B) вы можете щелкнуть правой кнопкой мыши на дампе потока, созданном в дереве слева, и сказать «Сохранить как».

Примечания jvisualvm также позволяет делать снимки всего приложения для последующего анализа.

1 голос
/ 24 января 2010

Другие постеры верны - ctrl-break в консоли или jstack.

В противном случае, если вы используете Java 1.5 или выше, вы можете получить эту информацию программно во время выполнения, используя:

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

, затем итерация результатов.

Немного скучно, но примерно так:

Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces();
Iterator<Thread> i = traces.keySet().iterator();
while (i.hasNext()) {
   Thread thd = i.next();
   System.out.println("*** Thread id"+thd.getId()+":"+thd.getName()+" ***");
   StackTraceElement[] trace = traces.get(thd);
   for (int j=0; j < trace.length; ++j) {
      System.out.println(trace[j]);
   }
   System.out.println();
}

Затем вы можете выбрать любой метод, который вы хотите перехватить в вашей программе, чтобы это произошло, и отформатировать / направить вывод.

Недостаток этого метода заключается в том, что он не является точным, поскольку не гарантируется, что стеки различных потоков будут взяты в одно и то же время. Однако есть дополнительное преимущество в производительности, заключающееся в том, что весь ваш процесс не будет приостановлен, пока делается снимок.

1 голос
/ 24 января 2010

В дополнение к ответу Сета вы также можете запустить JConsole на своем компьютере, чтобы проверить трассировку стека каждого потока. Это дает дополнительное преимущество, заключающееся в возможности обнаруживать взаимные блокировки и отслеживать использование памяти.

1 голос
/ 24 января 2010

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

http://java.sun.com/developer/technicalArticles/J2SE/monitoring/

http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html

http://java.sun.com/javase/6/docs/technotes/guides/visualvm/index.html

0 голосов
/ 24 января 2010

Посмотрите на этот пост переполнения стека

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

Мы реализовали метод JMX для вывода следов стека. Это действительно удобно, потому что вы можете просматривать трассировки стека в веб-браузере даже на удаленной машине.

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