-
21-08-2019 - |
题
我想知道(在 Java 世界中)是否存在能够通过以下功能拍摄 JVM 当前状态快照的东西:
- 在抛出异常时执行此操作。
- 捕获局部变量、方法的参数等。
- 将其放入一个方便的文件中,该文件可用于在 IDE 中提取或重现源代码中的情况。
前两个功能是必需的(第三个功能就很棒了)。而且它必须适合生产使用(因此,调试器是没有办法的)。
在问这个问题之前,我已经搜索了 WWW(尽可能长),并找到了一些提示:
- 箱鼓拦截机:正如中所述 Dzone 帖子, ,它是一个被动的 JVM 代理,满足三个要求!但是,它有两个缺点:您必须付费,并且该网站已关闭(也许没有机会支付任何费用)。
- AviCode Intercept Studio:Cajoon 的 .NET 等效项。只是为了提供一些见解。
- Java框架:好吧,这是一条推文,但它指向一个可用的 SVN 存储库,其中包含 JVM 代理的源代码(根据 MIT 许可),看起来不错(我将尝试一下)。
那么,也许我正在寻找一个不存在的解决方案?这并不紧急,但我有一个项目的想法,探索这条“未知”(?)路径并得到一些真实的东西会很棒。
似乎很清楚,它将是一个 JVM 代理(来自 JVMTI 的异常事件,例如 例子).
最后,我要强调以下段落 维基百科的异常处理文章:
在运行时引擎环境(例如Java或.NET)中,存在连接到运行时引擎的工具,并且每次发生兴趣的例外时,它们都会记录在抛出例外时内存中存在的调试信息(呼叫堆栈和堆堆)值)。这些工具称为自动异常处理或错误拦截工具,并为异常提供“根本原因”信息。
就是这个想法。我希望有人能给我一些见解,或者也许将来有人会从这篇不起眼的帖子中得到启发:)
谢谢!
解决方案
我看一下 Java框架 这似乎是一个很好的起点。只需安装 Apache Ant,即可 ant
在 javaframe 目录中并启动测试套件(在 test 目录内):
LD_LIBRARY_PATH=../build/native/ java -agentlib:frameintrospect -classpath ../build/classes/:. org.thobe.frame.Test
它没有获取任何局部变量,但它会尝试。因此,正如我所说,这可以作为一个起点。我希望进一步了解它的用法,但没有时间和没有文档(有很多名为 JavaFrame 的项目)是很糟糕的情况。
也许有一天可以再次这样做。是的,再来一次。还有 Cajoon,它看起来很有前途并且闪亮,但它的网站已经关闭,并且没有任何可下载的 jar 可供尝试。
谢谢大家!
PD:仅供参考,我在研究时发现的一些链接:
其他提示
您可能想了解 NetBeans 在自动使用日志记录方面所做的工作: http://wiki.netbeans.org/UsageLoggingSpecification.
至于转储局部变量,我想您可以简单地使用调试器,例如 bajafresh4life 提到的调试器。
也许可以这样做 方面J?
不确定这在生产环境中是否可行,但有 Omniscient 调试器:
如果您的调试器可以“及时倒退?”怎么办?这会让调试更容易吗?通过简单地记录所有变量分配,基本上可以做到这一点。这是全知调试的基本思想。令人惊奇的是,可以用这种方式调试非常大的程序——Ant、JUnit、调试器本身。