0

我正在附加gdb到正在运行的进程(我的多线程服务器)。然后我请求info thread并看到总是有+1(或2?)附加线程,我没有在我的代码中创建。我只创建了:

  • 4名工人(必须在cond_wait()
  • 1个信号线程(总是在sigwait()
  • 1个维护线程(每N秒执行一次,然后cond_wait()状态)
  • 1个线程使用popen()(每N秒执行一次,然后cond_wait()状态)
  • 1 个main()线程(在accept()

所以,= 我创建的 8 个线程。但是为什么报告 9 或 10 ???

系统是 FreeBSD 6.4

此外,这个附加线程总是有问题,它使我的程序崩溃并且它总是处于pthread_testcancel ()状态! c++ pthreads - 尝试锁定互斥锁以进行读取时崩溃

看来,*标号10的线程是当前正在执行的线程?它和8线程一样???或者我有 2 个额外的线程?正常吗?谢谢..对不起我的英语不好。

(gdb) info thread
* 10 LWP 100108  0x4865a79b in pthread_testcancel () from /lib/libpthread.so.2 ( WHAT IS ??? (1) )
  9 Thread 0x80d4000 (runnable)  0x486d7bd3 in accept () from /lib/libc.so.6
  8 Thread 0x80d4a00 (LWP 100090)  0x4865a79b in pthread_testcancel ()
   from /lib/libpthread.so.2 ( WHAT IS??? (2) )
  7 Thread 0x80d4c00 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2
  6 Thread 0x80d4e00 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2
  5 Thread 0x868b000 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2
  4 Thread 0x868b200 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2
  3 Thread 0x868b400 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2
  2 Thread 0x868b600 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2
  1 Thread 0x868b800 (sleeping)  0x48651cb6 in pthread_mutexattr_init ()
   from /lib/libpthread.so.2
4

1 回答 1

1

额外的线程是 3rd 方库的结果。快速搜索 curl、ImageMagick、tinyxml2 和 pcre 的源代码表明 curl 和 ImageMagick 有pthread_create()调用。

关于在 gdb 中调试:

  • info threads中,*指示当前正在检查的线程。它并不表示当前线程正在运行。
  • 在回溯中,in ?? ()可以指示库不是使用调试信息(-g使用 gcc)构建的,或者堆栈已损坏。通常,如果堆栈损坏,gdb 会给出明确的指示。

另外,一定要检查ImageMagick 的执行文档线程

于 2012-06-15T14:09:06.473 回答