9

我有一个 Java 1.6 应用程序,它通过作为接口提供的 JNI 类访问第三方本机模块。最近我们注意到原生模块中发生了 SEGFAULT,导致我们的应用程序崩溃。是否有可能捕获并处理此事件,至少在死前正确记录它?


我在kjp's answer的文章中尝试了这两种 Java 技术。都没有奏效。尝试在“SEGV”上安装信号处理程序会导致异常

VM 已使用的信号:SEGV

我安装的关闭处理程序根本无法触发,大概是因为IBM 文章所述:

关闭挂钩将不会运行,如果

调用 Runtime.halt() 方法来终止 JVM。提供 Runtime.halt() 以允许快速关闭 JVM。
指定了 -Xrs JVM 选项。
JVM异常退出,例如JVM软件产生的异常情况或强制中止。

4

2 回答 2

2

如果您只想记录并通知您可以编写一个运行您的应用程序的脚本。当应用程序死机时,脚本可以检测应用程序是否正常终止,并从包含所有崩溃/SEGV 信息的 hs_errXXXX 文件中检测并将其邮寄给某人(如果需要,可以重新启动应用程序)


您需要做的是在另一个 JVM 中运行错误的 JNI 代码,并使用 RMI 或 JMS 或套接字与该 JVM 通信。这样,当库死掉时,它不会关闭您的主应用程序,您可以重新启动它。

于 2012-07-04T19:48:02.847 回答
1

根据当时几周的研究,以及在会议上与 JVM 工程师的对话,这是不可能的。系统不会让您在 SEGV 信号上安装 SignalHandler。

于 2016-11-08T16:03:51.983 回答