Java 是否可以在本机代码中处理SEGFAULT组织?

Java 是否可以在本机代码中处理SEGFAULT组织?,java,signal-handling,Java,Signal Handling,我有一个Java1.6应用程序,它通过作为接口提供的JNI类访问第三方本机模块。最近,我们注意到本机模块中发生了SEGFAULT,导致应用程序崩溃。是否有可能捕获并处理此事件,至少在死亡前正确记录它 我在文章中尝试了这两种Java技术。两者都不起作用。尝试在“SEGV”上安装导致异常 VM已使用信号:SEGV 我安装的系统根本无法启动,大概是因为以下状态: 如果发生以下情况,将不会运行关机挂钩: 调用Runtime.halt()方法来终止JVM。提供Runtime.halt()以允许快速关闭J

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


我在文章中尝试了这两种Java技术。两者都不起作用。尝试在“SEGV”上安装导致异常

VM已使用信号:SEGV

我安装的系统根本无法启动,大概是因为以下状态:

如果发生以下情况,将不会运行关机挂钩:

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


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



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

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

这样做会对性能产生重大影响。。。这必须是唯一的选择,才能吸引我这么做。本机代码是否有公共调试符号?如果你能找到更多关于为什么会发生这种情况的信息,你也许可以提交一份足够全面的bug报告,让他们修复他们的库。@Benj正在并行地处理这个问题。他们会得到比他们想要的更多的信息。希望有一个备份计划。例如,在Windows上,您可以使用结构化异常处理(SEH)来捕获seg故障。如果您可以编写一个调用其代码的本机包装器,这可能是一个选项。这实际上取决于SEGV的原因,虽然这样可以捕获错误的指针解引用,但堆/堆栈损坏也可以捕获SEGV,捕获这一点可能会导致更多问题。@Benj AIX 64位,使用IBM 64位JVM。如果您自己使用JNI创建JVM,您可能会在异常终止时记录一些内容: