gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:38:34 24 4
gpt4 key购买 nike

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

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

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

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

  • 不影响性能
  • 无需更改代码即可将其关闭。

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

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

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

最佳答案

据我所知,除了调试 API 之外,没有官方的 Java API,调试 API 也可以在即将“调试”的虚拟机内部使用。

获取运行时创建的每个异常的通知的一种更简单快速但肮脏的方法是将一些跟踪代码直接破解到 Throwable 类的构造函数中,编译它并将其放入 bootclasspath 在 rt.jar 之前。这当然不是您在发布版本中应该做的任何事情,但它对于分析在某处捕获异常但未正确报告异常的代码非常有帮助。

回应评论:

关于调试器 API:上次我做这样的事情时我使用了 JVMDI构建 native JNI/JVMDI dll 并从 VM 内部访问它。它可以工作并允许您执行 Java 通常不提供的各种有线操作,但我认为这比使用修补的 Throwable 类更像是一种 hack。除此之外,JVMDI 已被弃用,并从 Java 1.6 开始被 JVM TI 取代。我不知道您是否以及如何使用这个新的调试器 API 来完成类似的事情。

使用修改后的 Throwable 速度快,易于正确使用,本身不会造成任何性能下降,而且如果您可以控制执行环境,甚至真的也不会很老套。您可以将其视为某种 AOP。 ;) 但我仍然只会用它来发现其他难以检测的错误,而不是在生产代码中或仅作为最后的手段。像这样的东西肯定不应该被视为设计的一部分。最好的长期方法是让您的所有开发团队就一些常见的异常处理达成一致。

还有 FindBugs如果您决定进行代码审查以找到所有这些异常被捕获但未报告的位置,这会有很大帮助。

关于java - JVM中无论是自己的还是第三方的代码,如何上报所有的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com