[java] 디버그 인수로 JVM을 시작하지 않고 Java 애플리케이션 디버그

일반적으로 실행중인 jvm에 디버 커를 연결하려면 다음과 같은 인수로 jvm을 시작해야합니다.

> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

이제 디버그 모드에서 시작되지 않은 프로세스를 디버깅하려면 어떻게해야합니까?

이 상황은 프로덕션 시스템 (즉, 디버그 인수없이 시작됨)이 ‘무작위'(저는 용어를 느슨하게 사용함) 버그를 나타낼 때 발생합니다. 따라서 아무도 버그를 다시 재현하는 방법을 모르기 때문에 적절한 인수로 jvm을 다시 시작할 수 없습니다. 이 상황에서 JVM에 연결할 수 없습니까?

디버그 모드에서 시작되지 않는 한 jdb와 같은 도구를 사용하여 이미 실행중인 JVM에 연결할 수 없음을 명확히하기 위해

JVM man 페이지에서

jdb를 사용하는 또 다른 방법은 이미 실행중인 Java VM에 연결하는 것입니다. jdb로 디버깅 할 VM은 다음 옵션을 사용하여 시작해야합니다.



답변

당신은 사용할 수 있습니다 jsadebugd를 ( JDK를 합니다 (와 Windows에서 사용할 수있는 프로세스에 디버그 서버를 연결) Windows 용 디버깅 도구 ). 실험용으로 표시되어 있으므로 먼저 테스트 머신에서 사용해 보는 것이 좋습니다.

용법:

jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

arg가있는 커넥터 이름은를 사용하여 찾을 수 있습니다 jdb -listconnectors.


답변

디버그 모드에서 시작하지 않는 한 jdb와 같은 도구를 사용하여 이미 실행중인 JVM>>에 연결할 수 없음을 명확히하기 위해

소련 러시아 소스에서 당신을 읽습니다

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426


답변

VisualVM 은 디버거가 아니지만 몇 가지 문제를 진단하는 데 유용 할 수있는 스레드 덤프 및 힙 덤프를 얻을 수 있습니다. 가장 유용한 기능을 사용하려면 JVM 5 또는 6이 필요합니다.


답변

jstack (교착 상태의 경우 유용함) 또는 btrace VisualVM 플러그인을 사용하여 트릭을 수행 할 수도 있습니다.


답변

항상 jdb를 사용하고 직접 디버그 할 수 있습니다.


답변