JVM堆栈内省

4

有没有一种在JVM上程序化地检查堆栈内容(包括值和值的类型以及当前指令点)的方法(即使它是供应商特定的)?

例如,我想要检查当前的激活帧并提取它所属的方法名称,以及堆栈变量。此外,我还想能够以这种方式迭代激活帧。

这可能吗?乍一看,JVMTI 似乎允许这样做,但它是作为本机接口使用的。显然已经使用它来实现可以执行这些操作的Java库,但这似乎有点过时。我想知道是否有集成到JVM API或其他跨平台JVM库的解决方案。

4个回答

3
我所找到的最相似的是Javaflow,它将带有本地变量的堆栈保存为一个对象。您还可以使用它将堆栈恢复到保存的状态。

谢谢,这看起来不错。我想知道Javaflow是否会急切地将堆栈上下文保存到继续对象中(即每次调用新方法或继续运算符时),还是只有在调用Continuation.suspend运算符时才这样做。 - axel22
我想只有在被调用时才会发挥作用,否则恢复就没有什么用了。 ;) - Peter Lawrey
1
“restore” 的意思是 “continueWith”。啊,如果可以多次使用 continueWith,那么它可能只在被要求时保存堆栈。我担心性能问题,这就是为什么我问的原因。但似乎 Javaflow 在类加载期间对字节码进行了处理。我以为处理会在运行时(类加载后)进行,只有在需要时才会进行。我想知道,如果每个方法都被处理,那么性能会受到什么影响。 - axel22
我认为了解的唯一方法就是尝试。 - Peter Lawrey
没问题:) 我会试一下! - axel22

2

如果您需要变量,请使用此API。正确的。 - Angel O'Sphere
1
以下是主页链接:http://java.sun.com/javase/technologies/core/toolsapis/jpda/ 非常感谢您发布这个答案! - James Drinkard

1

Thread.currentThread().getStackTrace() 有什么问题吗?就像这里指出的一样:stack overflow comment


1
这不包括堆栈上的变量。 - Steve McLeod
这更适合于调试目的,因为它仅返回源代码行以及被调用的类和方法的名称,而不是堆栈帧的实际内容。 - 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工具。

希望有所帮助, 詹姆斯


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接