我使用gdb来调试C代码,这是从Java调用的。我将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]发布于 2017-04-11 12:54:14
Java中的SIGSEGV可以不使JVM崩溃吗?
当然,如果在执行Java代码(不是本机代码)时发生了SIGSEGV,则很可能是因为取消引用一个null。它可以被捕获并转化为NullPointerException并“抛出”。应用程序可以从中恢复,即通过“捕获”异常。
我认为,Java堆栈溢出也可能触发SIGSEGV,导致Java代码在堆栈的“红区”内存段中读取或写入地址。
无论如何,在某些情况下,JVM的SIGSEGV信号处理程序可以将SIGSEGV事件转换为Java异常。只有在不发生这种情况时,才会发生JVM硬崩溃;例如,当事件发生时,触发SIGSEGV的线程正在本机库中执行代码。
https://stackoverflow.com/questions/43345363
复制相似问题