デバッグ引数でJVMを起動せずにJavaアプリケーションをデバッグする


95

通常、実行中のjvmにデバッガーを接続するには、次のような引数でjvmを起動する必要があります。

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

デバッグモードで開始されなかったプロセスをデバッグする場合、どうすればよいですか?

この状況は、実稼働システム(つまり、デバッグ引数なしで開始された)が「ランダム」(大まかにこの用語を使用している)バグを示したときに発生します。したがって、適切な引数でjvmを再起動することはできません。バグを再現する方法を誰も知らないためです。この状況でJVMに接続することは不可能ですか?

明確にするために、jdbなどのツールを使用して、すでに実行中のJVMに接続することは、それらがデバッグモードで開始されていない限り不可能です。

JVMのmanページから

jdbを使用するもう1つの方法は、すでに実行中のJava VMに接続することです。jdbでデバッグするVMは、次のオプションで起動する必要があります。


回答:


47

jsadebugdJDK)を使用して、デバッグサーバーをプロセスに接続できる場合があります(Windowsでデバッグツールを使用してWindowsで利用可能)。これは実験的としてマークされているため、最初にテストマシンで試してみるとよいでしょう。

使用法:

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

argを含むコネクタ名は、を使用して見つけることができますjdb -listconnectors


1
私はLinuxを使用しているので、これは最も有望な解決策のようです
hhafez 2008

これと共有する経験はありますか?
–ThorbjørnRavn Andersen 2012

1
私の経験では、必要なときに問題なく動作しました。つまり、ソフトウェアのすべてのファクトリインスタンスは、デフォルトでjvmデバッグオプションで起動するように構成されていないため、サポートされている方法を使用できます。
hhafez 2012

Java 11ではjsadebugdに置き換えられましたjhsdb debugd。それがになりjhsdb debugd --pid <pid>ます。参照してくださいjhsdb提示講演のスライドjhsdbのためのドキュメントを
Delthas

SADebugServerAttachingConnectorからjdbも削除されたようですが、差し替えはjhsdb hsdb/ と思われますjhsdb clhsdb。どの引数を指定するかについてのドキュメントが見つかりませんjhsdb clhsdb
Delthas

32

明確にするために、jdbなどのツールを使用して、すでに実行中のJVMに接続することはできません>>デバッグモードで開始されていない場合

ソビエトロシアのソースであなたを読みます

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

1
まあそれは「サポートされている」答えですが、実験的な答えは私が受け入れたものなので、サポートされていない
ファッション

7

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


リンクが機能しない...多分あなたはhttp://をhttps://の前に削除するかもしれません...私はまだ十分な評判を持っていなかったでしょう
ニュートピア

+1 VisualVMは本当に興味深いようです。ところで:リンクが修正されました。
sleske 2010年

5

jstack(デッドロックの場合に便利)またはbtrace VisualVMプラグインを使用してもトリックを実行できます


-5

いつでもjdbを使用して手動でデバッグできます:P


2
デバッグ接続を許可するためにjvmが開始されていない限り、jdbでjvmに接続できないといつも思っていましたが、間違っていますか?
hhafez 2008

私が理解している限り、あなたが言及したオプションは、「java」コマンド(VM)のリモートデバッグを「有効にする」ことですが、代わりにjdbコマンドを使用することもできます。したがって、java MyAppの代わりに、jdb MyApp(およびインタラクティブにデバッグ、ブレークポイントを設定、実行、停止、監視など)することになります
OscarRyz

1
jdbのマニュアルページによると、私はそれが正しいとは思いません-引用を開始jdbを使用する別の方法は、すでに実行中のJava VMに接続することです。jdbでデバッグするVMは、次のオプションで起動する必要があります
。-

正しいコネクタ(現時点ではサポートされていません)を使用すると、jdbは実行中のプロセスに接続できます。
–ThorbjørnRavn Andersen 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.