【发布时间】:2012-07-05 06:56:23
【问题描述】:
我有一个 Java 1.6 应用程序,它通过作为接口提供的 JNI 类访问第三方本地模块。最近我们注意到原生模块中发生了 SEGFAULT,导致我们的应用程序崩溃。是否有可能捕获并处理此事件,至少在死前正确记录它?
我在kjp's answer 的文章中尝试了这两种 Java 技术。都没有奏效。尝试在“SEGV”上安装signal handler 会导致异常
VM 已经使用的信号:SEGV
我安装的shutdown handler 根本无法触发,大概是因为IBM article 的状态:
如果发生以下情况,则不会运行关闭挂钩
调用Runtime.halt() 方法来终止JVM。提供 Runtime.halt() 以允许快速关闭 JVM。
指定了-Xrs JVM选项。
JVM异常退出,例如JVM软件产生异常情况或强制中止。
【问题讨论】:
-
本机代码是否可以使用公共调试符号?如果您能找到更多关于它发生原因的信息,您也许可以提交一份足够全面的错误报告,让他们修复他们的库。
-
@Benj 并行处理。他们会得到比他们想要的更多的信息。希望有一个备用计划。
-
例如,在 Windows 上,您可以使用结构化异常处理 (SEH) 来捕获 seg 错误。如果您可以编写一个本地包装器来调用他们的代码,那可能是一种选择。这实际上取决于 SEGV 的原因,虽然可以通过这种方式捕获错误的指针取消引用,但堆/堆栈损坏也可能是 SEGV,捕获它可能会导致更多问题。
-
@Benj AIX 64 位,使用 IBM 64 位 JVM。
-
如果您自己使用 JNI 创建了 JVM,您似乎可以在异常终止时记录一些内容:ibm.com/developerworks/java/library/i-signalhandling
标签: java signal-handling