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
),但对于行为良好的库应该没问题。
我有一个以单线程启动并处理一些视频帧的 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
),但对于行为良好的库应该没问题。