プログラムによるスレッドダンプ/ JDI(Java Debugger Interface)
-
04-07-2019 - |
質問
プログラムでスレッドダンプを生成するのが好きです。基本的に2つの方法があることを学びました:
- 「Java Virtual Machine Tool Interface」を使用します; JVM-TI
- より高度に抽象化された「Java Debugger Interface」を使用します。 JDI
JVM-TIについては、いくつかの有用な情報を見つけることができましたが、少なくとも現時点では回避したいJNI-DLLを作成する必要があります。 JDIを使用するとJavaを使用でき、アプリケーション内からJavaを使用できるようです。しかし、そのためのある種のチュートリアルやHOWTOを見つけることができませんでした。私が見つけた唯一のドキュメントは、Java-Docs httpでした。 //java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/ は、このクラスの使用方法を示していないため、あまり役に立ちません。
だから、誰かが私が読むことができる良いチュートリアル/本を知っていますか?
ヘルプについてはThx!
解決
リモートの代替案を検討しましたか?つまり VisualVM
jpsおよびjstack もJDK 5に含まれる便利なツールであり、現在のすべてのスレッドのスタックトレースを取得します。
この記事は、JDIがとしても使用されることを示唆しています。リモートツール。
したがって、自分のプログラム内でスレッドダンプをトリガーできるかどうかはわかりませんが、代わりに、UNIXプラットフォームでSIGQUITシグナルを送信する方法(kill -3)を見つけるか、UnixでCtrl- \キーを押すか、 WindowsプラットフォームでCtrl-Break。
さらに、 JDIは同じプロセスのデバッグに使用することを意図していませんでしたJDIクライアントが実行されている。それでも、私がリンクしたばかりのこのスレッドは、同じプログラム内で実際にJDIを使用するのに最も近いものです。
他のヒント
第三の方法があります:Thread.getAllStackTraces()
http:// java。 sun.com/javase/6/docs/api/java/lang/Thread.html#getAllStackTraces()
これは、デバッガーインターフェースよりもはるかに簡単です...
Thread.getAllStackTraces()は、すべてのスレッドの実行トレースのみをダンプしますが、特定のスレッドまたは特定のスレッドが待機しているロックによって取得されたオブジェクトロックの情報は提供しません。基本的に、これでデッドロックを特定することはできません。