我调试用GDB多线程的过程。 我整理了与唯一的源文件-g
标志。 然而,在GDB运行时,出现下列情况:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ?? ()
在此之前的开关,该特定线程执行sleep(5);
为什么不能识别GDB从中代码“segfaulted”的地步?
我调试用GDB多线程的过程。 我整理了与唯一的源文件-g
标志。 然而,在GDB运行时,出现下列情况:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ?? ()
在此之前的开关,该特定线程执行sleep(5);
为什么不能识别GDB从中代码“segfaulted”的地步?
0x00000011是不是一个有效的地址,尤其不适合代码。 这告诉我们,有在0x00000011无码(因此无功能)。 这告诉我们,你的堆栈已损坏。 如果没有“工作”栈,GDB无法弄清楚你的线程是如何结束的地方是有,因为它不记录任何默认调用,因此完全依赖于堆栈。
编辑请注意,在x86因为你已经通过代码来描述你将结束与类似的行为像
_start:
mov eax,0x11
jmp eax
这导致跳转/分支到区域(0×11)那里没有代码,因此没有调试符号都不是。 这可能的情况下发生像在我的例子,而且如果堆被覆盖(损坏)和回跳导致一个无效的地址(如为0x11)