如何判断哪行代码创建了新线程 (gdb)

How to tell what line of code created new thread (gdb)?

本文关键字:新线程 线程 gdb 创建 何判断 判断 代码      更新时间:2023-10-16

我正在尝试调试一个相当复杂的程序,该程序是seg错误。我刚刚了解了gdb,并试图使用它来查找问题。目前,它显示

[New Thread 0x7fff4963700 (LWP 4768)]
[New Thread 0x7fff1faf700 (LWP 4769)]
[New Thread 0x7fff17ae700 (LWP 4768)]

在我的计划开始后不久。如果我编写了多线程代码,那就太好了,但我没有。有没有办法准确地告诉哪行代码正在创建这些新线程?

在 Linux 上工作,catch syscall clone应该在所有线程(可能还有一些进程)创建时中断。请注意,它将在创建者线程中中断(=新线程尚未启动)。

由于您获得了导致clone的完整回溯,如果您需要提取新的线程入口点,您应该up直到到达pthread_create(或类似的库函数)堆栈帧并从其参数中获取它(您也可以直接检查参数以clone,但我担心那里的地址会有一些 pthread 库存根)。

线程有自己的调用堆栈。您唯一能看到的是堆栈底部的值。将线程 ID 指向 t <thread id>thread <thread id>,并使用 btbacktrace 获取调用堆栈。在暂停执行应用程序期间,您可以在gdb中暂停执行并运行info threads期间获取线程 ID。

例如,我的 gdb 会话看起来像这样(特意尝试让您更清楚)这个:

(gdb) t 23
[Switching to thread 23 (Thread 0x7fff8ffff700 (LWP 32334))]
#0  0x00007fffc0cb829e in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
(gdb) bt
#0  0x00007fffc0cb829e in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
#1  0x00007fffc0cb5bb0 in ?? () from /usr/lib/x86_64-linux-gnu/libgomp.so.1
#2  0x00007ffff52b10a5 in start_thread (arg=0x7fff8ffff700) at pthread_create.c:309
#3  0x00007ffff591a88d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

在这里 gdb 表示调用堆栈的第一个值位于 libgomp.so 中的某个位置(OpenMP 库)。接下来,您可以看到pthread_create.c哪个是依赖于系统启动线程的方法。