GDB 报告的额外线程是怎么回事?

What's with the extra threads reported by GDB?

我有一个以单线程启动并处理一些视频帧的 C++ 应用程序。对于每一帧,应用程序生成 2 个加入的线程,这是在每一帧的循环中完成的。

我正在尝试调查是否还有我未检测到的线程。该应用程序非常复杂,加载可能产生自己的线程的共享库

我使用 gdb 的信息线程

这是我得到的:

  Id   Target Id         Frame 
  7    Thread 0x7fffde7fc700 (LWP 16644) "my_debugged_process" sem_wait ()
    at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:85
  6    Thread 0x7fffdeffd700 (LWP 16643) "my_debugged_process" sem_wait ()
    at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:85
  5    Thread 0x7fffdf7fe700 (LWP 16642) "my_debugged_process" sem_wait ()
    at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:85
  4    Thread 0x7fffdffff700 (LWP 16641) "my_debugged_process" sem_wait ()
    at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:85
  3    Thread 0x7fffe4988700 (LWP 16640) "my_debugged_process" sem_wait ()
    at ../nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S:85
  2    Thread 0x7fffe5c0b700 (LWP 16639) "my_debugged_process" 0x00007ffff3dc812d in poll ()
    at ../sysdeps/unix/syscall-template.S:81
* 1    Thread 0x7ffff7fc2800 (LWP 16636) "my_debugged_process" TheApplication::SomeClass::processFrame (this=0x743530, srcI=..., 
    dstI=...) at TheApplication.cpp:315

所以问题是:

2到7的线程是什么?它们是否与我的进程有某种关联? 我只识别线程 1。

我看到他们都在等待信号量,所以我倾向于说他们属于调试器。

首先,Jonathan 在评论中所说:在 Linux,gdb 不会在您的进程中创建任何线程。 gdb 试图对您的应用程序产生合理的最小影响——它不能为零,但它非常接近。

其次,Jonathan 再说一遍:在 运行 之后尝试理解线程,获取回溯并查看它是否有意义。对于单线程:

(gdb) thread 52  # e.g.
(gdb) bt

或者对于所有的人:

(gdb) thread apply all bt

最后,要在创建线程时查看线程,一种尝试方法是在线程启动时获取回溯:

(gdb) break pthread_create
(gdb) commands
> bt
> cont
> end

这应该在创建线程时打印堆栈跟踪。这不一定适用于所有情况(某些程序直接调用 clone),但对于行为良好的库应该没问题。