为什么Java应用程序在gdb中崩溃但在现实生活中可以正常运行?
因为它 实际上 并没有崩溃。
Java使用推测性负载。如果指针指向可寻址内存,则加载成功。指针很少指向可寻址的内存,并且尝试的加载会生成
SIGSEGV…,java运行时会拦截它,使内存可再次寻址,然后重新启动加载指令。
在调试Java程序时,通常必须这样做:
(gdb) handle SIGSEGV nostop noprint pass
不幸的是,如果涉及到某些JNI代码,并且 该
代码
SIGSEGV,GDB也将很乐意忽略该信号,从而导致劣等(正在调试)进程的死亡。对于后一个问题,我尚未找到可接受的解决方案。



