我在 GDB 中调试一个多线程进程。我使用 -g
标志编译了唯一的源文件。但是,在GDB中运行时,出现了如下场景:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ?? ()
在切换之前,特定线程执行 sleep(5);
为什么 GDB 无法识别代码“段错误”的起点?
最佳答案
0x00000011 不是有效地址,尤其是代码。这告诉我们,在 0x00000011 处没有代码(因此没有函数)。这告诉我们,您的堆栈已损坏。 如果没有“工作”堆栈,gdb 无法弄清楚您的线程是如何结束的,因为默认情况下它不记录任何调用,因此仅依赖于堆栈。
编辑 请注意,在 x86 上,您最终会遇到类似代码所描述的行为
_start:
mov eax,0x11
jmp eax
这会导致跳转/分支到一个区域 (0x11),该区域没有代码,因此也没有调试符号。这可能发生在我的示例中的情况下,但如果堆栈被覆盖(损坏)并且返回的跳转导致无效地址(如 0x11)
关于c - GDB 线程进程的怪癖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3971091/