2011-09-16 78 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