2009-03-18 7 views
5

Windows를 사용하는 클라이언트 시스템에서 실행중인 JVM 프로세스에 대해 스택 추적을 얻어야합니다.Windows에서 Java 스택 추적

클라이언트에 JRE가 설치되어 있지만 JDK는 설치되어 있지 않습니다.

JStack을 사용하고 싶지만 설치되지 않았으므로 클라이언트 컴퓨터에 JDK를 설치할 수 없습니다. 또한 Java Webstart 세션의 AdaptJ 스택 추적 제품을 사용해 보았지만 지정된 PID에서 응용 프로그램을 시작한 세션이 아니라는 것에 대해 원격으로 오류가 발생하기 때문에 작동하지 않았습니다.

기본적으로 JDK를 설치하지 않고 JStack을 설치하는 방법이 필요합니다.

+3

Threads.bat 표준 출력에 전체 스레드 스택 추적을 덤프 유닉스/리눅스 JRE의 원인이됩니다. 매우, 매우, 매우 편리합니다. –

답변

5

정확한 목적으로 설계된 SendSignal을 사용하고 싶을 것입니다.

+0

SendSignal 웹 페이지에서 보면 앱이 서비스로 실행 중이거나 인수로 -Xrs (신호 사용량 줄이기)가있는 경우주의해야합니다. 그렇다면 Java의 ctrl + break 처리가 비활성화되고이 신호를 받으면 응용 프로그램이 종료됩니다. –

+0

사실,이 목적으로 SendSignal.exe를 사용하여 서비스로 실행되는 JRE의 스택 덤프를 발생시킵니다. 그것은 나를 위해 작동합니다. – Eddie

+0

예, 누군가 "java -Xrs ..."를 실행하면 아마도 SendSignal.exe에 문제가있을 것입니다. 해결책은 동시에 둘 다 할 수 없다는 것입니다. 하나를 선택하십시오. -Xrs를 사용하거나 SendSignal.exe를 사용하여 스택 덤프를 생성하십시오. 너의 선택. – Eddie

2

JConsole을 (를) 원격 액세스를 통해 사용할 수 있습니까?

+0

+1 jvisualvm도 편리합니다. –

4

JDK 및 관련 도구는 "설치"되어 있는지 여부에 관계없이 잘 작동합니다. 임시 디렉토리에 압축을 풀면 jstack을 실행할 수 있습니다. (PATH 또는 JAVA_HOME 수정이 필요하지 않음). 클라이언트가 응용 프로그램을 실행하고있는 JRE와 동일한 버전을 사용하고 있는지 확인하십시오. 최소한 JConsole의 경우에는 버전이 다르면 조급해하는 것 같습니다. jstack이 같은 방식으로 작동하는지 잘 모르겠습니다.

저는 이것이 이상적인 해결책이라는 것을 말하는 것이 아닙니다. 제 생각에는 jdigital과 Eddie의 제안이 더 나은 첫 번째 베팅이라고 생각합니다. 설치 프로그램을 실행하는 것과 같은 방식으로 기존 Java 설치를 방해해서는 안되지만 고객은 관계없이 동의하지 않을 수 있습니다.

2

jstack 및 jps는 JDK의 tools.jar에 포함되어 있습니다. jstack을 프로세스에 첨부하려면 attach.dll이 필요합니다.

물론 tools.jar 및 attach.dll은 JRE의 일부가 아닙니다.

JDK가없는 시스템 (대부분 Windows)에서 jstack을 작동 시키려면 대개 다음을 수행하십시오.

  1. JDK의 tools.jar 및 attach.dll을 복사하여 대상 시스템의 위치에 넣습니다. 예 : c : \ temp \ jstack
  2. JRE를 사용하여 수동으로 호출하는 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.bat를 만들 :

예를 들어, 박쥐 파일 jstack.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는이 방법으로 정상적으로 작동하지만 "java.util.ServiceConfigurationError : com.sun.tools.attach.spi.AttachProvider : jstack이 실패했습니다. 공급자 sun.tools.attach.WindowsAttachProvider를 인스턴스화 할 수 없습니다" –

+0

@EmmanuelBourg attach.dll이 -Djava.library.path =에 언급 된 경로에 있는지 확인하십시오? Pls가 확인합니다. attach.dll은 jstack에 프로세스를 첨부해야합니다. –

+0

예,하지만 관리자 권한으로 실행중인 프로세스에 연결하려고했는데 셸에 높은 권한이 없었기 때문에 문제가 설명되어있었습니다. –

0

JRE 만있는 스레드 덤프를 얻으려면 동일한 Java 버전의 JDK에서 tools.jar 및 attach.dll이 필요합니다. 이것을 어딘가에 설치하고 이것을 jre에 복사하십시오. 동일한 버전이어야합니다!

시스템 계정에서 실행중인 프로세스의 덤프가 필요한 경우 Windows sysinternals psexec.exe를 사용하여 프로세스에 액세스 할 수 있습니다. 이것을 JRE bin이나 경로의 어딘가에 복사하십시오.

이 배치 파일은 파일 이름이 datetime 인 파일에 스택 덤프를 작성하므로 여러 추적을 쉽게 비교하고 비교할 수 있습니다.

그냥 참조를 위해, "죽일 -3 PID"

:: 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