如何判断哪行代码创建了新线程 (gdb)
How to tell what line of code created new thread (gdb)?
我正在尝试调试一个相当复杂的程序,该程序是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>
,并使用 bt
或 backtrace
获取调用堆栈。在暂停执行应用程序期间,您可以在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
哪个是依赖于系统启动线程的方法。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 多线程:线程或进程.h - C++
- BOOST线程:线程还是进程
- 如何在线程线程内部制作内存?
- C++ - 多线程 - 线程之间的通信
- C++多线程:线程安全的内存分配
- 如何在 Linux 上强制 g++ 在协程切换线程时更新线程指针(对于 TLS)
- 如何确定流程的"经理"和"工作线程"线程的优先级(或为其设置调度策略)?
- 一旦另一个线程完成,就会生成一个新线程
- 是boost::线程线程安全的
- c++多线程-线程安全的代码
- 依靠额外的线程-线程安全
- Linux多线程——线程不会产生任何预期的输出
- 线程-线程创建问题
- 只在前一个线程完成时创建一个新线程
- 创建新线程时在lambda内部使用unique_ptr的线程安全性