我有一个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.
我看到他们都在等待信号量,所以我倾向于说他们属于调试器。
答案 0 :(得分:2)
首先,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
)但对于行为良好的库应该没问题。