【发布时间】:2017-09-06 19:22:39
【问题描述】:
我正在使用 gdb 调试从 Java 调用的 C 代码。我将 gdb 附加到正在运行的 Java 进程,它可以工作。有些。古玩的事情是 GDB 定期报告 SIGSEGV 并且它不会使 Java 崩溃。我希望 JVM 会关闭并生成带有错误信息的 hs_err_pid。我想知道这些错误是否实际上是由 gdb 引起的(不知道如何)并且不会真正发生在正在运行的代码中,或者在某些情况下 Java 是否可以从 SIGSEGV 中恢复(不知道如何)。
编辑:这是完整的 gdb 输出:https://pastebin.com/Mk44kWXQ
例子:
Thread
52 "java" received signal SIGSEGV, Segmentation fault.
0x00007f9f3a93d4b1 in ?? ()
-exec-continue
[New Thread 0x7f9ea4b46700 (LWP 10135)]
[New Thread 0x7f9eb4079700 (LWP 10137)]
[Thread 0x7f9eac95e700 (LWP 10130) exited]
Thread
52 "java" received signal SIGSEGV, Segmentation fault.
0x00007f9f3a93d4b1 in ?? ()
-exec-continue
[Thread 0x7f9ea534c700 (LWP 9960) exited]
【问题讨论】:
-
我认为这太模糊了。如果您要包含 gdb 会话的完整终端转储,那可能会更容易回答。
-
如果 Java 虚拟机在单独的沙箱中运行 C 代码,那么沙箱中的任何 seg 错误都不会导致 Java 虚拟机崩溃。
-
@PaulOgilvie - 我从未听说过这样做的 Java 实现。这将使 C 和 Java 之间的切换变得昂贵,并且(在很大程度上)破坏了从 Java 调用 C 的目的。
标签: java c debugging gdb segmentation-fault