programing

debug 인수를 사용하여 JVM을 시작하지 않고 Java 응용 프로그램을 디버깅합니다.

sourcejob 2022. 9. 30. 11:06
반응형

debug 인수를 사용하여 JVM을 시작하지 않고 Java 응용 프로그램을 디버깅합니다.

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

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

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

이 상황은 프로덕션 시스템(즉, debug args 없이 시작됨)에서 '랜덤'(약하게 사용) 버그가 발생할 때 발생합니다.따라서 적절한 인수를 사용하여 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

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

jstack(데드록이 있는 경우 유용) 또는 btrace VisualVM 플러그인을 사용하여 문제를 해결할 수도 있습니다.

항상 jdb와 디버깅을 수동으로 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/376201/debug-a-java-application-without-starting-the-jvm-with-debug-arguments

반응형