Eclipse不断地在GDB中查找故障
在弄清楚为什么Eclipse会在我身上崩溃时,我尝试启动Eclipse并将GDB附加到EclipseJava进程。然而,几乎在我连接GDB并告诉它继续的时候,就有一个不断的SEGFULTS流,几乎就在我继续之后。这是其中的一部分:Eclipse不断地在GDB中查找故障,eclipse,gdb,segmentation-fault,Eclipse,Gdb,Segmentation Fault,在弄清楚为什么Eclipse会在我身上崩溃时,我尝试启动Eclipse并将GDB附加到EclipseJava进程。然而,几乎在我连接GDB并告诉它继续的时候,就有一个不断的SEGFULTS流,几乎就在我继续之后。这是其中的一部分: Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7f445879d700 (LWP 22968)] 0x00007f445739b3f4 in JVM_NewIns
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f445879d700 (LWP 22968)]
0x00007f445739b3f4 in JVM_NewInstanceFromConstructor () from /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so
(gdb) bt
#0 0x00007f445739b3f4 in JVM_NewInstanceFromConstructor () from /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so
#1 0x00007f444d012698 in ?? ()
#2 0x00000000f6031d10 in ?? ()
#3 0x00000000f6031cf8 in ?? ()
#4 0x00007f44587999b0 in ?? ()
#5 0x0000000000000000 in ?? ()
(gdb) c
Continuing.
[Thread 0x7f43d2a0f700 (LWP 23085) exited]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f43d211c700 (LWP 23111)]
0x00007f44570c86a4 in ThreadInVMfromJava::~ThreadInVMfromJava() () from /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so
(gdb)
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x00007f445736e6fc in jni_ReleasePrimitiveArrayCritical () from /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so
(gdb)
Continuing.
[Thread 0x7f43d211c700 (LWP 23111) exited]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f43d280d700 (LWP 23087)]
0x00007f44570c86a4 in ThreadInVMfromJava::~ThreadInVMfromJava() () from /usr/java/jdk1.7.0_45/jre/lib/amd64/server/libjvm.so
(gdb)
Continuing.
[New Thread 0x7f43d211c700 (LWP 23174)]
奇怪的是,当所有这些故障发生时,Eclipse似乎继续运行得很好。我在Eclipse的错误日志和dmesg中都没有看到任何segfaults。有没有人知道为什么会发生这种情况,为什么Eclipse会不顾SEGFULTS继续运行,以及它是否需要修复?我也很好奇,一个程序如何在收到segfault的情况下继续运行,尽管我假设一个信号处理程序可能正在消耗信号并阻止程序退出
奇怪的是,当所有这些故障发生时,Eclipse似乎继续运行得很好
这对于任何Java二进制文件(Eclipse就是其中一个例子)都是应该的
Java运行时相当复杂,使用了大量低级技巧。特别是,它将尝试机会主义地取消对指针的引用,如果该指针不正确,则获取SIGSEGV
,在信号处理程序中重新调整内容,然后恢复执行
另请参见答案。啊,我明白了,谢谢,我不知道为什么我在搜索时没有找到其他答案。是否可以过滤所有Java SIGSEGV以在我的JNI代码中找到真正的SIGSEGV?@BorisBrodski我知道没有简单的方法。我确实知道一种不那么容易的方法,但答案会很长。你介意再问一个问题吗?