我正在使用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]
Java 中的 SIGSEGV 不会使 JVM 崩溃吗?
当然,如果在执行 Java 代码(不是本机代码(时发生 SIGSEGV,则很可能是由于取消引用 Java null
。 这可以被困住并变成NullPointerException
并"扔掉"。 应用程序可以从中恢复;即通过"捕获"异常。
我认为 SIGSEGV 也可能由 Java 堆栈溢出触发,导致 Java 代码在堆栈的"红色区域"内存段中读取或写入地址。
无论如何,肯定存在JVM的SIGSEGV信号处理程序可能会将SIGSEGV事件转换为Java异常的情况。 如果不能发生这种情况,您只会得到 JVM 硬崩溃;例如,如果触发 SIGSEGV 的线程在事件发生时正在本机库中执行代码。