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