我正在调试GDB中具有多个线程的过程。我用 -g 旗帜。但是,在GDB中运行时,发生以下情况:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ?? ()

在开关之前,特定线程执行A sleep(5);

GDB为什么不能识别代码“ segfault”的点?

有帮助吗?

解决方案

0x00000011不是有效的地址,尤其是对于代码而言。这告诉我们,在0x00000011上没有代码(因此没有函数)。这告诉我们,您的堆栈已损坏。没有“工作”堆栈,GDB将无法弄清您的线程如何最终到达所在的位置,因为它默认情况下不会记录任何调用,因此仅依赖堆栈。

编辑请注意,在x86上,您最终会以与代码所描述的类似行为相似

_start:
   mov eax,0x11
   jmp eax

这导致跳跃/分支到达一个没有代码的区域(0x11),因此也没有调试符号。在我的示例中,这可能发生在案例中,而且如果堆栈被覆盖(损坏),并且返回跳跃导致无效地址(如0x11)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top