2014-10-10 76 views
-1

我想在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

+0

一个更有趣的问题是为什么这么多线程?猜你喜欢处理器进行上下文切换,而不是完成任务! – 2014-10-10 04:31:45

+0

我无法控制..这是一个非常大的代码库 – bohanl 2014-10-10 06:07:05

+0

非常好的问题。我不明白那些没有评论的解释。通常你不知道你正在使用的库创建的线程,并且想要将问题跟踪到你的代码。类似问题:http://stackoverflow.com/questions/6069484/finding-creator-of-crashed-thread-in-os-x-gdb – 2017-01-19 13:54:18

回答

1

如何揣摩出这个线程42从开始的?

您不能:GDB和操作系统都不会跟踪“谁启动此线程”。 (知道某个特定线程创建的位置通常也是无用的)。

你可以做的是要么把仪器到您自己的呼叫pthread_create和日志“线程X创建的线程Y”,或使用catch syscall clone,并在GDB版画创作的堆栈跟踪,然后再与它们匹配的崩溃线程(赛它的LWP返回值为clone earler)。

此外,为什么最后一行(frame#0)没有显示出来?

您的意思是帧数#3。它不存在 - clone是线程承载(存在)的地方。

P.S.安装的libc调试符号,所以你可以看到其中__nptl_deallocate_tsd线程崩溃更可能提供线索比知道线程创建细节。