【问题标题】:Is it possible to handle a SEGFAULT orginating in native code?是否可以处理源自本机代码的 SEGFAULT?
【发布时间】: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


【解决方案1】:

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


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

【讨论】:

  • 这样做会对性能产生一些重大影响......它必须是唯一能诱使我走这条路的选择。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2013-10-16
    • 2013-01-02
    • 2011-10-10
    相关资源
    最近更新 更多