2009-03-18 5 views
5

Мне нужно получить трассировку стека для процесса JVM, запущенного на клиентской машине, использующей окна.Трассировка стека Java в Windows

Клиент имеет установленную JRE, но не JDK.

Я хочу использовать JStack, но он не установлен, и мы не можем установить JDK на машине клиента. Я также попытался использовать продукт отслеживания стека AdaptJ из сеанса Java Webstart, но это не сработало, потому что мы удаляемся и получаем ошибку о том, что не было сеанса, запускавшего приложение с указанным PID.

По сути, я хочу, чтобы установить JStack без установки JDK.

+3

Просто для справки, "убить -3 PID" приведет к Unix/Linux JRE, чтобы сбросить всю стеку потока трассировки в стандартный вывод. Очень, очень, очень удобно. –

ответ

5

Возможно, вы захотите использовать SendSignal, который был разработан именно для этой цели.

+0

От взгляда на веб-страницу SendSignal я был бы осторожен, если приложение запускается как служба (или в противном случае имеет -Xrs (уменьшить использование сигнала)) в качестве аргумента. Если это так, обработка ctrl + break Java отключена, и приложение прекратит работу, когда получит этот сигнал. –

+0

На самом деле я использую SendSignal.exe для этой цели, чтобы вызвать stackdump JRE, работающего как служба. Меня устраивает. – Eddie

+0

Да, если кто-то запускает «java -Xrs ...», возможно, у них будет проблема с SendSignal.exe. Решение состоит в том, что вы не можете выполнять оба одновременно. Выбери один. Либо используйте -Xrs, либо используйте SendSignal.exe, чтобы вызвать stackdump. Твой выбор. – Eddie

2

Можете ли вы использовать JConsole через удаленный доступ?

+0

+1 jvisualvm также удобен –

4

JDK и связанные с ним инструменты прекрасно работают независимо от того, установлен ли он или нет, если вы просто зацикливаете и извлекаете его во временный каталог, вы должны иметь возможность запускать jstack. (Не требуется модификация PATH или JAVA_HOME). Просто убедитесь, что вы используете ту же версию, которая соответствует JRE, на которой работает клиент, с вашим приложением. По крайней мере, в случае JConsole, кажется, возникает проблема, если версии разные. Я не уверен, что jstack ведет себя одинаково.

Я не говорю, что это идеальное решение, просто так оно и будет работать. Я думаю, что предложения jdigital и Eddie лучше, чем первые, и хотя это не должно мешать существующей установке java, так же, как работает установщик, клиент может не согласиться.

2

jstack и jps являются частью tools.jar JDK. Также attach.dll требуется для подключения jstack к процессу.

Ofcourse tools.jar и attach.dll не являются частью JRE.

Чтобы сделать jstack работу над системами, в которых нет JDK (в основном Windows), я обычно делаю следующее.

  1. Копия tools.jar и attach.dll из JDK и положить в некоторые места на целевой системе. Пример: в c: \ temp \ jstack
  2. Напишите сценарий летучей мыши, чтобы вручную вызвать его с помощью JRE.

Например, создать летучая мышь файл jstack.bat:

set JRE=c:\jrefolder 
"%JRE%\bin\java" -classpath "c:\temp\jstack\tools.jar" -Djava.library.path="c:\temp\jstack" sun.tools.jstack.JStack %* 

Аналогично для JPS, создать jps.bat с следующим содержанием.

набора JRE = C: \ jrefolder

"%JRE%\bin\java" -classpath "c:\temp\jstack\tools.jar" -Djava.library.path="c:\temp\jstack" sun.tools.jps.Jps %* 

Использование:

jstack.bat -l <pid> 

Надеется, что это помогает.

+0

jps отлично работает в этом режиме, но jstack failed с "java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: поставщик sun.tools.attach.WindowsAttachProvider не может быть создан" –

+0

@EmmanuelBourg Вы уверены, что файл attach.dll присутствует в пути, указанном в -Djava.library.path =? Pls подтверждает. attach.dll требуется для присоединения процесса к jstack. –

+0

Да, но я пытался подключиться к процессу, выполняемому как Администратор, и у моей оболочки не было повышенных привилегий, что, вероятно, объясняет проблему. –

0

Для получения дампа потока только с JRE вам нужны tools.jar и attach.dll из JDK той же версии Java. Установите это где-нибудь и скопируйте их в jre. Должна быть идентичная версия!

Если вам нужна дамп процесса, выполняющегося под учетной записью системы, вы можете использовать sysinternals Windows psexec.exe, чтобы получить доступ к процессу. Скопируйте это в ящик JRE или где-нибудь на пути.

Этот командный файл записывает дамп стека в файл с именем файла datetime, поэтому можно легко и легко сравнивать несколько трасс.

Threads.bat

:: Creates a thread dump for the tomcat6.exe process 
:: saved in a timestamped filename and views it! 
:: Jim Birch 20111128 rev 2015-10-12 

::Required the following files to be placed in the jre/bin folder: 
:: attach.dll - From the Java JDK (must be the same version) 
:: tools.jar - ditto 
:: psexec.exe - from Windows sysinternals 

::cd to jre/bin 
d: 
cd \application\jre\bin 

::build datetime filename 
rem datetime from wmi.exe 
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set dt0=%%I 
rem datetime string as YYYY-MM-DD-hhmmss 
set dt=%dt0:~0,4%-%dt0:~4,2%-%dt0:~6,2%-%dt0:~8,6% 
set ff=td-%dt%.txt 
echo filename: %ff% 

::PID of the process by named exe, eg, tomcat6  
for /F "tokens=2" %%I in ('TASKLIST /NH /FI "IMAGENAME eq tomcat6.exe"') DO SET PID=%%I 
echo pid: %PID% 

::combine above with jstack command 
psexec -s jstack.exe -l %PID% >> %ff% 

:: view result 
start %ff% 

::insert pause to debug or timer to review script operation 
::ping localhost -n 20 >nul 
::pause 
Смежные вопросы