Java相当于未捕获异常的coredump

Zar*_*rat 5 java error-handling crash-dumps

什么是Linux coredump或Windows minidump的Java等价物?我已经阅读了堆转储,它看起来像我想要的,但是如何在未捕获的异常上(自动)触发它们?

我知道未捕获的异常处理程序,我已经用它来打印异常+堆栈跟踪并终止整个应用程序(否则线程死了,应用程序继续运行?呵呵?)另外我发现这篇文章关于如何记录堆从代码转储,但如果我从未处理的异常处理程序执行此操作,Java已经捕获了异常并且堆栈跟踪(和参数)消失了.

我遇到了-XX:+HeapDumpOnOutOfMemoryError似乎做我需要的旗帜,不幸的是只是因为内存异常,而不是其他未被捕获的异常.

到目前为止,这是我唯一能够摆脱谷歌的事情.目前我正在使用带有异常断点的附加调试器,但这是不切实际的,因为它还会中断处理的异常,因此无法在无人监督的情况下使用它.

[动机更新]

我希望能够检查堆栈跟踪的参数和局部变量,以找出导致异常的原因.它通常是空引用异常或断言失败,我不能总是从行号中猜出究竟出了什么问题.在C/C++中,我习惯于使用coredump/minidump崩溃,然后进一步检查实际导致崩溃的原因.

ams*_*ams 2

如果您不执行 JNI 并调用本机代码,则很难损坏 JVM 的内存,异常不应需要堆转储或核心转储。

在 Java 世界中,抛出异常的代码应该为读取异常的人提供足够的信息,以便能够确定问题的原因。有时这种情况不会发生,正确的处理方法是修改异常抛出代码以在异常中提供更多信息或将某些内容记录到日志文件中。

如果抛出异常的代码不在您的控制之下,并且您无权访问源代码,那么您可以使用 AspectJ 来为抛出异常的方法编织一些建议,然后您可以检查方面并记录它们。但在路由aspectJ /字节代码编织之前,您可能想看看您尝试理解的代码是否使用log4j或其他具有调试日志记录级别的日志框架,这可能会包含您正在寻找的信息。

您可能想看看 Google Guava 开源库,它有一个关于前提条件的很好的部分,您可以使用它来验证参数并获取有关问题原因的更多背景信息。http://code.google.com/p/guava-libraries/wiki/PreconditionsExplained

您可能还想查看http://www.slf4j.org/,它有一个很好的日志记录API,您可以使用它来记录有关您遇到的问题的信息。

您还可以在 eclipse 中设置条件断点,这允许您仅在特定情况下执行断点。http://wiki.eclipse.org/FAQ_How_do_I_set_a_conditional_breakpoint%3F

另一个可以使用的工具是 jvisiual vm,它允许您连接到实时虚拟机并找出有关虚拟机内部发生情况的大量信息,例如所有线程在哪里、是否有死锁、GC 正在做什么以及您可以用它触发堆转储,然后查询它们并查看堆转储中特定对象的状态。http://docs.oracle.com/javase/7/docs/technotes/guides/visualvm/index.html