如何知道谁开始了一个帖子

时间:2014-10-10 04:08:53

标签: multithreading gdb

我正在尝试调试gdb中的崩溃,其中核心转储在此线程上。还有其他40多个线程在同一时间进行。如何确定此线程42的起始位置?

另外,为什么最后一行(第0帧)没有出现?

Thread 42 (Thread 0x2aaba65ce940 (LWP 15854)):
#0  0x0000003a95605b03 in __nptl_deallocate_tsd () from /lib64/libpthread.so.0
#1  0x0000003a9560684b in start_thread () from /lib64/libpthread.so.0
#2  0x0000003a946d526d in clone () from /lib64/libc.so.6
#3  0x0000000000000000 in ?? ()

我正在使用gdb版本7.7

1 个答案:

答案 0 :(得分:1)

  

如何确定此线程42的起始位置?

你不能:GDB和OS都没有跟踪“谁开始这个帖子”。 (知道创建特定线程的位置通常也毫无用处。)

您可以做的是将检测放入您自己的pthread_create调用并记录“线程X创建的线程Y”,或使用catch syscall clone,并在GDB中打印创建堆栈跟踪,然后匹配它们稍后到崩溃的线程(将其LWPclone管理员的返回值匹配)。

  

另外,为什么最后一行(第0帧)没有出现?

你的意思是框架#3。它不存在 - clone是线程所在的位置(存在)。

P.S。安装libc调试符号以便在__nptl_deallocate_tsd内看到 where 线程崩溃的可能性比提供线程创建细节更有可能提供线索。