2008-10-27 66 views
6

我喜歡以編程方式生成線程轉儲。我瞭解到有一個基本上有兩種方式來做到這一點:以編程方式線程轉儲/ JDI(Java調試器接口)

  1. 使用「Java虛擬機工具接口」 JVM-TI
  2. 使用更高的抽象「Java調試器界面」 JDI

對於JVM-TI,我能夠找到一些有用的信息,但是我必須編寫一個JNI-DLL,至少目前我想避免。使用JDI,我可以使用Java,看起來我可以在應用程序中使用它。但我無法找到某種教程或HOWTO。我能找到的唯一文檔是Java-Docs http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/,這不是很有用,因爲它沒有告訴我如何使用這個類。

那麼,有沒有人知道我可以閱讀的好教程/書?

Thx任何幫助!

回答

1

您是否考慮過遠程替代方案?即VisualVM

thead dump with visualVM http://java.sun.com/javase/6/docs/technotes/guides/visualvm/images/applications-window-menu.png

jps and jstack也包括在JDK 5有用的工具,提供了用於獲得所有當前線程的堆棧跟蹤快速命令行方法。

本文建議JDI也用作remote tool

所以我不確定你可以在自己的程序中觸發一個線程轉儲,而是找到一種方法在Unix平臺上發送一個SIGQUIT信號(kill -3),或者按下Unix上的Ctrl- \鍵或Windows平臺上的Ctrl-Break。

加,JDI wasn't intended to be used to debug the same process in which the JDI client is running。我剛纔鏈接的這個線程是我發現在同一個程序中實際使用JDI的最接近的線程。

+0

由於死鎖的線程信息,至少現在我有一個特定的論壇,在這裏我可以問! – BugSlayer 2008-10-27 13:02:29

3

Thread.getAllStackTraces()只轉儲的執行軌跡所有線程,但不提供已由特定線程或特定線程等待的鎖獲得的對象鎖的信息。基本上,我們不能用這個來確定死鎖。