通常、実行中のjvmにデバッガーを接続するには、次のような引数でjvmを起動する必要があります。
> Java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n
デバッグモードで開始されなかったプロセスをデバッグする場合、どうすればよいですか?
この状況は、実稼働システム(つまり、デバッグ引数なしで開始された)が「ランダム」(私はこの用語を大まかに使用します)バグを示すときに発生します。だから、適切な引数でjvmを再起動することはできません。バグを再現する方法を誰も知らないからです。この状況でJVMに接続することは不可能ですか?
明確にするために、jdbなどのツールを使用して、既に実行中のJVMをデバッグモードで起動しない限り接続することはできません。
jVM manページから
jdbを使用する別の方法は、Java VMすでに実行されています。AVM = jdbでデバッグする場合は、次のオプションを使用して起動する必要があります。
jsadebugd ( [〜#〜] jdk [〜#〜] )を使用して、デバッグサーバーをプロセスに接続できます(Windowsで- Windows用デバッグツール )。実験的としてマークされているため、最初にテストマシンで試してみることができます。
使用法:
jsadebugd <pid>
jdb -connect Sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost
引数付きのコネクタ名は、jdb -listconnectors
を使用して見つけることができます。
明確にするために、jdbなどのツールを使用して、既に実行中のJVMに接続することはできません。
ソビエトロシアの情報源ではあなたを読む
jdb -connect Sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
VisualVM はデバッガーではありませんが、スレッドダンプとヒープダンプを取得することができ、いくつかの問題の診断に役立ちます。最も有用な機能には、JVM 5または6が必要です。
jstack(デッドロックの場合に便利)または btrace VisualVMプラグインを使用することもできます