2009-03-18 20 views
5

È necessario ottenere una traccia stack per un processo JVM in esecuzione su un computer client che utilizza Windows.Traccia stack Java su Windows

Il client ha installato JRE ma non JDK.

voglio usare jstack ma non è installato e non siamo in grado di installare un JDK sulla macchina del cliente. Ho anche provato a utilizzare AdaptJ Stack Trace Product da una sessione Webstart Java, ma non ha funzionato perché eseguiamo il remote-in e riceviamo un errore relativo alla mancata sessione che ha avviato l'applicazione in un PID specificato.

In sostanza, voglio un modo per installare JStack senza installare JDK.

+3

Solo per riferimento, "uccidere -3 pid" causerà un sistema Unix/Linux jre per scaricare l'intera traccia dello stack thread per stdout. Molto, molto, molto utile. –

risposta

5

Probabilmente si desidera utilizzare SendSignal, che è stato progettato esattamente per questo scopo.

+0

Osservando la pagina web SendSignal, farei attenzione se l'app viene eseguita come un servizio (o altrimenti ha -Xrs (riduce l'utilizzo del segnale)) come argomento. In tal caso, la gestione di ctrl + interruzione di Java è disabilitata e l'applicazione terminerà quando riceve questo segnale. –

+0

In realtà, utilizzo SendSignal.exe per questo scopo per causare uno stackdump di un JRE in esecuzione come servizio. Per me funziona. – Eddie

+0

Sì, se qualcuno esegue "java -Xrs ..." allora forse avranno un problema con SendSignal.exe. La soluzione è che non puoi fare entrambi allo stesso tempo. Scegline uno. Utilizzare -Xrs o utilizzare SendSignal.exe per causare un riversamento. La tua scelta. – Eddie

2

Sarebbe possibile utilizzare JConsole tramite accesso remoto?

+0

+1 jvisualvm è anche utile –

4

il JDK e associati strumenti funzionano bene se "installato" o no, se si zip e estrarlo in una directory temporanea, si dovrebbe essere in grado di eseguire jstack. (Nessuna modifica PATH o JAVA_HOME necessaria). Assicurati di utilizzare la stessa versione che corrisponde al JRE sul quale il client ha l'applicazione in esecuzione. Almeno nel caso di JConsole, sembra preoccuparsi se le versioni sono diverse. Non sono sicuro che jstack si comporti allo stesso modo.

Non sto dicendo che questa sia la soluzione ideale, solo che funzionerebbe. Penso che i suggerimenti di jdigital e di Eddie siano migliori prime scommesse, e anche se ciò non dovrebbe interferire con un'installazione java esistente nello stesso modo in cui viene eseguito l'installer, il cliente potrebbe non essere d'accordo.

2

jstack e jps fanno parte di tools.jar del JDK. Anche attach.dll è necessario per allegare jstack a un processo.

Naturalmente, tools.jar e attach.dll non fanno parte di JRE.

Per fare jstack su un sistema che non ha JDK (principalmente Windows), di solito faccio quanto segue.

  1. Copia tools.jar e attach.dll da JDK e inserire in qualche posizione sul sistema di destinazione. Esempio: a c: \ temp \ jstack
  2. Scrivere uno script bat per invocarlo manualmente utilizzando JRE.

Ad esempio, creare un file bat 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 %* 

Allo stesso modo per jps, creare un jps.bat con i seguenti contenuti.

set JRE = c: \ jrefolder

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

Usage:

jstack.bat -l <pid> 

Spero che questo aiuti.

+0

jps funziona bene in questo modo, ma jstack non è riuscito con "java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: provider sun.tools.attach.WindowsAttachProvider non può essere istanziato" –

+0

@EmmanuelBourg Sei sicuro che il file attach.dll sia presente nel percorso menzionato in -Djava.library.path =? Confermare. attach.dll è necessario per allegare il processo a jstack. –

+0

Sì, ma stavo cercando di collegarmi a un processo in esecuzione come amministratore, e la mia shell non aveva privilegi elevati, che probabilmente spiega il problema. –

0

Per ottenere un dump di thread con solo un JRE è necessario tools.jar e attach.dll dal JDK della stessa versione di Java. Installalo da qualche parte e copialo nel jre. Deve essere la versione identica!

Se è necessario eseguire un dump di un processo in esecuzione con l'account di sistema, è possibile utilizzare Windows sysinternals psexec.exe per accedere al processo. Copia questo nel cestino JRE o da qualche parte nel percorso.

Questo file batch scrive il dump dello stack in un file con un nomefile datetime in modo che più tracce possano essere prese e confrontate facilmente.

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 
Problemi correlati