Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的SIGSEGV能不能使JVM崩溃?_Java_C_Debugging_Gdb_Segmentation Fault - Fatal编程技术网

Java中的SIGSEGV能不能使JVM崩溃?

Java中的SIGSEGV能不能使JVM崩溃?,java,c,debugging,gdb,segmentation-fault,Java,C,Debugging,Gdb,Segmentation Fault,我正在使用gdb调试C代码,这是从Java调用的。我将gdb附加到运行的Java进程上,它可以正常工作。有点有趣的是GDB定期报告SIGSEGV,它不会使Java崩溃。我希望JVM运行下去,生成带有错误信息的hs_err_pid。我想知道这些错误是否真的是由gdb(不知道如何)引起的,并且在运行的代码中没有真正发生,或者在某些情况下Java是否可以从SIGSEGV中恢复(不知道如何) 编辑:这里是完整的gdb输出: 例如: Thread 52 "java" received signal SIG

我正在使用gdb调试C代码,这是从Java调用的。我将gdb附加到运行的Java进程上,它可以正常工作。有点有趣的是GDB定期报告SIGSEGV,它不会使Java崩溃。我希望JVM运行下去,生成带有错误信息的hs_err_pid。我想知道这些错误是否真的是由gdb(不知道如何)引起的,并且在运行的代码中没有真正发生,或者在某些情况下Java是否可以从SIGSEGV中恢复(不知道如何)

编辑:这里是完整的gdb输出:

例如:

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
和“抛出”。应用程序可以从中恢复;i、 e.通过“捕获”异常

我认为SIGSEGV也可能由Java堆栈溢出触发,导致Java代码读取或写入堆栈“红色区域”内存段中的地址


无论如何,在某些情况下,JVM的SIGSEGV信号处理程序可能会将SIGSEGV事件转化为Java异常。如果无法实现,您只会遇到JVM硬崩溃;e、 g.如果触发SIGSEGV的线程在事件发生时正在本机库中执行代码。

我认为这太模糊了。如果要包含gdb会话的完整终端转储,这可能会让它更容易回答。如果Java VM在单独的沙盒中运行C代码,那么沙盒中的任何seg故障都不会使Java VM崩溃。@PaulOgilvie-我从来没有听说过这样的Java实现。这会使C和Java之间的切换变得昂贵,并且(在很大程度上)会破坏从Java.OK调用C的目的,因此它可能是一个正常的Java NullPointerException,或者一些内部JVM的东西。我不知道NPE是由SEGFULT启动的,我假设JVM在解引用之前执行检查。谢谢。JVM检测空值解引用的方式实际上取决于实现。可能有不同的策略,我希望JIT编译器在不同的上下文中选择不同的策略。一种策略是测试null,另一种策略是捕获SIGSEGV。