GDB报告的额外线程有什么用?

时间:2015-09-28 17:40:20

标签: c++ linux multithreading debugging 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.

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

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)但对于行为良好的库应该没问题。