c - GDB 线程进程的怪癖

标签 c gdb pthreads segmentation-fault

我在 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/

相关文章:

c - 避免线程间竞争条件的彼得森算法

c++ - gdb 继续而不是步进

c++ - Gcc 4.8 DWARF4 与 DWARF2

iphone - 如何在 Xcode 中使用带有嵌套静态库的调试器?

c - 如何使用 pthread 一次性读取多个正在运行的进程?

c++ - 未创建目标文件

c - 编译程序时出现"No Definition"错误

objective-c - c风格的指针和id风格的对象有什么区别?

c - C(转换器)中未完全正常运行

c - 将参数中的函数指针传递给 pthread_create,(C)