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


95

일반적으로 실행중인 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은 다음 옵션을 사용하여 시작해야합니다.


답변:


47

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

용법:

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

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


1
나는 리눅스를 사용하고 있기 때문에 이것이 가장 유망한 해결책 인 것 같다
hhafez

이것과 공유 할 경험이 있습니까?
Thorbjørn Ravn Andersen

1
내 경험은 내가 필요로 할 때 잘 작동했다는 것입니다. 그동안 소프트웨어의 모든 공장 ​​인스턴스는 기본적으로 jvm 디버그 옵션으로 시작하도록 구성되어 있지 않으므로 지원되는 방법을 사용할 수 있습니다.
hhafez

Java 11 jsadebugd에서 jhsdb debugd. 그래서 jhsdb debugd --pid <pid>. jhsdbjhsdb대한 문서를
Delthas

그것도 SADebugServerAttachingConnector제거 된 것 같고 jdb대체품은 jhsdb hsdb/ 라고 생각합니다 jhsdb clhsdb. 에 제공 할 인수에 대한 문서를 찾을 수 없습니다 jhsdb clhsdb.
Delthas

32

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

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

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

1
물론 그는 "지원"대답 만이 지원되지 않는 FASION에서 수행 할 수 있도록 실험 대답은, 내가 인정 하나입니다
hhafez

7

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


링크가 작동하지 않습니다 .... 아마도 당신은 https : // 전에 http : //를 제거 할 수 있습니다 ... 나는 아직 충분한 평판을 얻지 못했을 것입니다
Newtopian

+1 VisualVM은 정말 흥미로워 보입니다. BTW : 이제 링크가 수정되었습니다.
sleske

5

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


-5

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


2
디버그 연결을 허용하기 위해 jvm이 시작되지 않으면 jdb로 jvm에 연결할 수 없다고 항상 생각했습니다.
hhafez

내가 아는 한, 언급 한 옵션은 "java"명령 (VM)의 원격 디버그를 "활성화"하는 것입니다.하지만 대신 jdb 명령을 사용할 수도 있습니다. 따라서 java MyApp 대신 jdb MyApp (및 대화식으로 디버그, 중단 점 설정, 실행, 중지, 감시 등)을 사용합니다.
OscarRyz

1
jdb man 페이지에 따르면 이것이 맞다고 생각하지 않습니다. start quote jdb를 사용하는 또 다른 방법은 이미 실행중인 Java VM에 연결하는 것입니다. jdb로 디버깅 할 VM은 다음 옵션을 사용하여 시작해야합니다.-end quote
hhafez

올바른 커넥터 (현재 지원되지 않음)를 사용하면 jdb가 실행중인 프로세스에 연결할 수 있습니다.
Thorbjørn Ravn Andersen 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.