web-dev-qa-db-ja.com

デバッグ引数を使用して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すでに実行されています。AVM = jdbでデバッグする場合は、次のオプションを使用して起動する必要があります。

92
hhafez

jsadebugd[〜#〜] jdk [〜#〜] )を使用して、デバッグサーバーをプロセスに接続できます(Windowsで- Windows用デバッグツール )。実験的としてマークされているため、最初にテストマシンで試してみることができます。

使用法:

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

引数付きのコネクタ名は、jdb -listconnectorsを使用して見つけることができます。

46
McDowell

明確にするために、jdbなどのツールを使用して、既に実行中のJVMに接続することはできません。

ソビエトロシアの情報源ではあなたを読む

jdb -connect Sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
29
potted plant

VisualVM はデバッガーではありませんが、スレッドダンプとヒープダンプを取得することができ、いくつかの問題の診断に役立ちます。最も有用な機能には、JVM 5または6が必要です。

8
sk.

jstack(デッドロックの場合に便利)または btrace VisualVMプラグインを使用することもできます

5
Vijay