java - 自动异常处理

标签 java exception exception-handling jvm agent

我想知道是否存在某种东西(在 Java 世界中)能够使用以下功能拍摄 JVM 当前状态的快照:

  • 在抛出异常时执行此操作。
  • 捕获局部变量、方法的参数等。
  • 将它放在一个方便的文件中,该文件可用于在 IDE 中提取或重现源代码中的情况。

前两个功能是必需的(第三个会很棒)。并且它必须适合生产使用(因此,调试器是没有办法的)。

在问这个问题之前,我已经搜索了 WWW(尽可能长)并且找到了一些建议:

  • Cajoon Interceptor :如 Dzone post 中所述,它是一个满足三个要求的被动 JVM 代理!但是,它有两个缺点:您必须为此付费,而且网站已关闭(也许没有机会支付任何费用)。
  • AviCode Intercept Studio :Cajoon 的 .NET 等价物。只是为了提供一些见解。
  • JavaFrame : 好的,这是一条推文,但它指向一个可用的 SVN 存储库,该存储库具有 JVM 代理的源代码(在 MIT 许可下)看起来不错(我打算尝试一下)。

所以,也许我正在寻找一个不存在的解决方案?这并不紧急,但我对一个项目有这个想法,探索这个“未知”(?)路径并获得一些真实的东西会很棒。

很明显它将是一个 JVM 代理(来自 JVMTI 的异常事件,对于 example )。

最后,我要强调以下来自 Wikipedia's Exception Handling article 的段落:

In runtime engine environments such as Java or .NET, there exist tools that attach to the runtime engine and every time that an exception of interest occurs, they record debugging information that existed in memory at the time the exception was thrown (call stack and heap values). These tools are called Automated Exception Handling or Error Interception tools and provide 'root-cause' information for exceptions.

就是这个意思。我希望有人能给我一些见解,或者也许在将来,有人会从这篇不起眼的帖子中得到启发:)

谢谢!

最佳答案

我看看JavaFrame这似乎是一个很好的起点。只需安装 Apache Ant,在 javaframe 目录中执行 ant 并启动测试套件(在测试目录中):

LD_LIBRARY_PATH=../build/native/ java -agentlib:frameintrospect -classpath ../build/classes/:. org.thobe.frame.Test

它没有获取任何局部变量,但它尝试了。所以,正如我所说,它可以作为一个起点。我希望进一步了解它的用法,但没有时间和文档(有很多名为 JavaFrame 的项目)是糟糕的情况。

也许有一天它可以再次完成。是的,又一次。有 Cajoon,它看起来很有前途而且很 Shiny ,但它的网站已经关闭并且没有任何可下载的 jar 可供尝试。

谢谢大家!

PD.: 仅供引用,我在研究时找到的一些链接:

关于java - 自动异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/372589/

相关文章:

language-agnostic - 为什么要重新抛出异常?

ios - NSMutableDictionary 有两个指向同一对象的键导致 "double free"异常

python - Try-Except block - 我这样做正确吗?

c++ - 为什么构造函数不能优雅地处理错误?

java - 如何用一个打印 "root cause first"堆栈跟踪替换 JUnit 4.12 中的全局异常处理程序?

java - 检查字符串是否包含主题标签词

java - Android googleMap map 不显示,只有网格,有时

java android错误将异常写入包裹

java - 从两个表中获取相似的列名和计数

c# - InvalidCastException Dictionary<string, string> 使用 Exception.Data