2014-10-10 168 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線程崩潰更可能提供線索比知道線程創建細節。