2011-09-16 115 views
3

有沒有一種方法可以在JVM上以編程方式檢查堆棧的內容(包括值和值的類型以及當前指令點)(即使它是供應商特定的)?JVM堆棧自檢

例如,我想檢查當前的激活幀並提取它所屬的方法名稱以及堆棧變量。此外,我希望能夠以這種方式迭代激活幀。

這可能嗎?乍一看,JVMTI似乎允許這樣做,但它的意思是用作本機界面。已經在used上實現了一個可以完成這些事情的Java庫,顯然 - 但這似乎有些過時。我想知道是否有一個解決方案集成到JVM API或其他一些跨平臺的JVM庫中。

回答

2

我相信Java Platform Debugger Architecture (JPDA)是你在找什麼。

+0

正確,如果您還需要變量,請使用此API。 –

+1

這裏是主頁面的鏈接:http://java.sun.com/javase/technologies/core/toolsapis/jpda/把這個答案出來的榮譽! –

+0

不錯,謝謝!我正在查看它。 – axel22

3

我發現的最接近的是Javaflow,它將本地變量的堆棧保存爲對象。您也可以使用它將堆棧恢復到保存狀態。

+0

謝謝,這看起來不錯。我想知道Javaflow是否急切地將堆棧上下文保存到繼續對象中(即每次調用新方法或繼續運算符時),或者只有在調用運算符「Continuation.suspend」時才這樣做。 – axel22

+0

我想它只有在被調用時,否則恢復不會太大用處。 ;) –

+1

通過'恢復'你的意思是'continueWith'。啊,是的,如果'continueWith'可以多次使用,那麼可能只有在被問到時纔會保存堆棧。我很擔心表演,這就是我問的原因。但似乎Javaflow在類加載期間處理字節碼。我認爲儀表會在運行時(類加載後)發生,在需要時。我想知道如果每種方法都得到檢測,性能會有什麼影響。 – axel22

1

Thread.currentThread().getStackTrace()有什麼問題?因爲poininted在這裏:stack overflow comment

+1

這不包括堆棧上的變量 –

+0

這對於調試目的更合適,因爲它只返回源代碼行,類的名稱和正在調用的類的方法,而不是實際的內容堆棧框架。 – axel22

1

看看這個頁面: http://download.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/tools.html

他們有上市jstack實用程序:從Java進程

此實用程序可以獲取Java和本機堆棧信息。在Solaris OS和Linux上,該實用程序還可以從核心文件或遠程調試服務器獲取信息。請參閱2.11 jstack實用程序。

我從來沒有使用過它,但我已經使用了jdk自帶的Visual VM工具。

HTH, James