如何报告JVM中的所有异常,无论是自己的还是第三方代码?

时间:2010-01-20 21:20:01

标签: java gdb exception

有没有办法记录JVM中发生的所有异常?

系统是由不同组提供的大量较小组件构建的。所有这些都在同一个JVM(在Weblogic下)中运行。

错误报告策略在这些组中有很大不同,因此有时我们会遇到抑制异常的情况,这使得故障排除非常困难。与此同时,我注意到JDB能够拦截代码中发生的任何异常,无论在哪里。

我想使用JDB在DEV / SIT / UAT环境中使用的相同工具来缩短问题解决时间。在PTE和PROD中,虽然设施不仅要关闭,而且

  • 不会产生任何性能影响
  • 不需要更改代码即可将其关闭。

当然,我可以将JDB连接到DEV / SIT中运行的每个服务器实例。我认为这是可行的......但有两个主要缺点:

  • 使配置更复杂
  • JDB在发生异常时停止;需要一个脚本或其他东西让它继续

所以我想知道是否有任何方法可以做到这一点,例如Runtime.traceExceptions(...)吗

4 个答案:

答案 0 :(得分:4)

据我所知,除了调试API之外,没有正式的Java API,也可以从即将被“调试”的VM内部使用。

一种更容易快速和脏的方式来获得在运行时创建的每个异常的通知是将一些跟踪代码直接破解到Throwable类的构造函数中,编译它并将其放入bootclasspath在rt.jar之前。这当然不是你应该在发布版本中做什么,但是它可以非常有用地分析在某处捕获异常并且不能正确报告它们的代码。

回应评论:

关于Debugger API:上次我做了类似的事情时,我使用JVMDI构建了一个本机JNI / JVMDI dll,并从VM内部访问它。它可以工作,并允许你做各种Java通常不提供的有线事情,但我认为这比使用修补的Throwable类更糟糕。除此之外,自Java 1.6以来,JVMDI已被弃用并被JVM TI取代。我不知道是否以及如何使用这个新的Debugger API做这样的事情。

使用修改后的Throwable快速,易于理解,不会自行降低性能,如果您可以控制执行环境,甚至真的 hackish。你可以把它想象成某种AOP。 ;)但我仍然只会使用它来查找其他难以检测到的错误,而不是在生产代码中或仅作为最后的手段。这样的东西肯定不会被视为设计的一部分。最好的长期方法是让所有开发小组就一些常见的异常处理达成一致。

如果您决定进行代码审查以查找所有这些异常被捕获且未报告的位置,FindBugs也可以提供很多帮助。

答案 1 :(得分:1)

我可能会解压缩JDK,修改“异常”以记录您的异常,然后重新启动它。

这是一个非常合理的解决方案,不会导致任何问题 - JDK类在很大程度上只是标准的java类。

在阅读JDK版本之前,您可以通过操作类路径来读取“异常”版本来修改JDK,这样就可以做到这一点 - 这样就不会那么难以分发。

答案 2 :(得分:0)

GDB是为GCC构建的程序而设计的。如果您正在调试Java应用程序,我建议您在IDE中使用Java Debugger。它可以用来捕获抛出的任何异常。

注意:有些库在正常启动期间抛出异常,并想象Weblogic有自己的一些。

答案 3 :(得分:0)

Fedora上有一个项目 - ABRT - 自动错误报告工具。

它还报告未捕获的JVM异常。

现在(2013年),我们开始努力使其能够捕获JBoss AS / EAP / WildFly异常。

请继续关注它的来源:https://fedorahosted.org/abrt/milestone/Support_for_JAVA_exceptions