代码之家  ›  专栏  ›  技术社区  ›  Vladimir Dyuzhev

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

  •  2
  • Vladimir Dyuzhev  · 技术社区  · 16 年前

    有没有一种方法可以记录在JVM中发生的所有异常?

    一个系统是由不同的组提供的大量较小的组件构成的。它们都在同一个JVM中运行(在WebLogic下)。

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

    我想使用JDB在dev/sit/uat环境中使用的相同工具来缩短问题解决时间。在PTE和Prod中,设施不仅应关闭,而且

    • 不影响性能
    • 不需要更改代码就可以关闭它。

    当然,我可以让JDB连接到在dev/sit中运行的服务器的每个实例。我想这是可行的…但有两个主要的缺点:

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

    所以我想知道是否有任何方法可以做到这一点,例如runtime.traceexceptions(…)?

    4 回复  |  直到 16 年前
        1
  •  4
  •   Rich    14 年前

    据我所知,除了调试API之外,还没有正式的Java API,它也可以从即将被调试的虚拟机中使用。

    在运行时创建的每个异常得到通知的一种简单、快速和肮脏的方法是将一些跟踪代码直接黑客到可丢弃类的构造函数中,编译它并将其放入 bootclasspath 在rt.jar之前。当然,在发布版本中,这是不应该做的,但是分析在某个地方捕获异常并且不能正确报告异常的代码会非常有帮助。

    回应评论:

    关于调试器API:上次我这样做时,使用了 JVMDI 构建本机JNI/JVMDI DLL并从VM内部访问它。它工作,让你做各种各样的有线的东西,Java通常不提供,但我会认为这更是一个黑客比使用修补的可抛出类。除此之外,JVMDI已经被弃用,并且自从Java 1.6以来被JVM TI所取代。我不知道您是否可以以及如何使用这个新的调试器API来做类似的事情。

    使用一个修改过的一次性是快速的,容易得到正确的,不强加任何性能退化本身,甚至不 真正地 如果您控制着执行环境,那么就进行黑客攻击。你可以把它看作某种AOP。;)但是我仍然只会用它来发现很难发现的错误,而不是在生产代码中,或者只是作为最后的手段。像这样的东西肯定不应该作为设计的一部分。最好的长期方法是让所有的开发团队在一些常见的异常处理上达成一致。

    阿尔索 FindBugs 如果您决定进行代码检查来查找所有这些异常被捕获和未报告的地方,那么这会有很大帮助。

        2
  •  1
  •   Bill K    16 年前

    我可能会取消jdk的jar,修改“exception”来记录您的异常,然后重新jar它。

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

    在读取JDK的版本之前,通过操纵类路径来读取“exception”的版本,您可以在不修改JDK的情况下完成这项工作——这样就不难分发了。

        3
  •  0
  •   Peter Lawrey    16 年前

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

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

        4
  •  0
  •   Ondra Žižka David Lilljegren    12 年前

    有一个关于Fedora-Abrt-自动错误报告工具的项目。

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

    现在(2013年),已经开始努力让它也捕获jboss as/eap/wildfly异常。

    请随时关注以下信息: https://fedorahosted.org/abrt/milestone/Support_for_JAVA_exceptions