是否可以在其运行时数据区中访问java线程的堆栈帧?

时间:2013-11-30 10:19:46

标签: java debugging jvm stack-trace

我们可以使用Thread.currentThread()。getStackTrace()来获取当前的stackTrace。但是StackTraceElement只包含一些信息,例如类名,方法名,行号等,它们只是静态信息。我想要更多运行时数据。我想访问存储在当前线程的堆栈帧中的方法参数值。这可能吗?非常感谢!

添加此问题的一些背景知识。我正在尝试在捕获异常时打印出每个堆栈帧的方法参数值(即stackTrace中的每个堆栈帧)。 这可能吗?我读到了java虚拟机,当函数返回时(正常或突然完成异常),将弹出当前堆栈帧。所以我认为即使可以访问堆栈帧,我们也只能访问堆栈帧仍在堆栈中的堆栈。我是对的吗?

AOP可能会解决这个问题。使用AOP,我可以做一些代码注入来预先保存每个方法的参数值。当异常发生时,我可以查找保存的信息。但我认为这可能不是关于性能问题的最佳解决方案。

1 个答案:

答案 0 :(得分:0)

使用java调试架构可以访问java中的堆栈帧,这意味着您可以使用调试器。虽然您的要求可能会引入安全威胁,因为您希望访问其范围之外的方法参数。

如果你急切希望它在运行时打印而不是去调试器,我可以想到的一种方法是更好地创建bean信息并将单个方法的所有信息设置到其中。您可以将它们存储在跨方法的有序集合中,并在异常时打印它们。

AOP也没关系。

但是,实现这么少似乎太过分了。可能会更清楚你的目的会有所帮助。