2010-03-20 1 views
9

지금까지 jstackjmap을 사용하여 스레드 덤프 및 힙 덤프를 생성하는 방법을 배웠습니다.Java 용 코어 덤프 동일

그러나 jstack 스레드 덤프에는 각 스레드의 스택을 설명하는 텍스트 만 들어 있습니다. Java VisualVM을 사용하여 힙 덤프 (.hprof 파일)를 열면 힙에 할당 된 객체 만 표시됩니다.

내가 실제로 원하는 것은 스택을보고 특정 스택 프레임으로 전환하고 로컬 변수를 볼 수있게하려는 것입니다. 이러한 종류의 사후 디버깅은 WinDbg, gdb 및 코어 파일 (네이티브 C++ 프로그램 용)과 같은 도구를 사용하여 정상적으로 수행 할 수 있습니다.

"코어"파일 - 살아있는 환경) 자바에 존재합니까?

답변

2

나는 Sun forum과 SO discussion에 관련 정보를 찾았습니다. 나는 그것에 대해별로 행운이 없었지만 귀하의 경우에는 효과가있을 수 있습니다.

참고 : 언급 된 도구 중 일부는 Java 도구이지만 지원되지 않으며 Windows 버전의 JDK에서는 사용할 수 없습니다.

+0

감사합니다. 나는'jsadebugd'가 내가 찾고있는 것에 아주 가깝다고 생각한다. – Gant

1

표준 자바에서는 그런 덤프 메커니즘이 존재하지 않는다고 생각합니다.

5

자바 않습니다. IBM VM을 사용하는 경우 com.ibm.jvm.Dump.SystemDump()을 사용하여 프로그래밍 방식으로 덤프를 생성하십시오. 이것은 디버거를 사용하여 디버깅 할 수 있습니다. 나는 당신의 Java 프로세스를 "kill"한다고해서 시스템 덤프가 생성되어야한다고 생각한다. 유닉스의 경우 kill -4 pid 여기서 pid는 프로세스 ID이고 1 VM 인스턴스가 실행중인 경우 top | grep java을 입력하여 쿼리 할 수 ​​있습니다.

또한 이벤트를 필터링하고 (-Xdump:system:events=fullgc)를 특정 VM 정지 등의 이벤트 (-Xdump:system:events=vmstop), 전체 가비지 수집에 덤프를 생성하기 위해 자바 명령 행에 -Xdump:system 또는 -Xdump:heap 등을 추가 할 수 있습니다, 등을 참고하여 힙의 크기에 따라, 전체 GC에서 덤프를 생성하는 것은 좋은 생각이 아닙니다. 예를 들어, 힙을 4M에서 20 초에 약 60M으로 증가시키는 경우 20 초 동안 50 개의 덤프를 생성 할 수 있습니다. 따라서 -Xdump:system:events=fullgc,range=50..55과 같은 카운터를 추가하면 5 개의 코어가 생성됩니다 50 번째에서 55 번째까지의 전체 쓰레기 수거

1

일부 운영 체제 (예 : Linux의 경우 Solaris mdb 또는 gdb)는 덤프 파일에서 일반 네이티브 디버거를 사용할 수 있도록 지원하며 일부는 Java 스택 프레임 표시를 지원합니다. 그러나 이것은 Java Debugger와 잘 통합되지 않았기 때문에 여러분이 원하는 것은 아니지만 꽤 하드 코어입니다.