1. 程式人生 > >gdb 除錯多執行緒

gdb 除錯多執行緒

如果目標程序已經core dump了,那麼 gdb -c core xxx   xxx是對應的程式檔案。
如果目標程序還在執行,通常此時用於除錯執行緒死鎖的情況。有兩種方法
一是 gdb -p xxx  xxx是該程序的程序ID
或者用gcore xxx先獲取對應程序的core,他會生成一個core檔案 core.xxx
 
進入gdb後
(gdb) info threads
可以列出所有的執行緒,預設設為當前的執行緒前面有一個*號
比如
gdb) info thread
    9 system thread 154262  Priority:154  0xc00000000042f670:0 in __ksleep
   +0x30 () from /usr/lib/hpux64/libc.so.1
    4 system thread 153674  Priority:168  0xc0000000004367d0:0 in _nanosleep2_sys+0x30 () from /usr/lib/hpux64/libc.so.1
    3 system thread 153673  Priority:168  0xc0000000004367d0:0 in _nanosleep2_sys+0x30 () from /usr/lib/hpux64/libc.so.1
    2 system thread 153672  Priority:154  0xc00000000042f670:0 in __ksleep
   +0x30 () from /usr/lib/hpux64/libc.so.1
*   1 system thread 153671  Priority:154  0xc000000000432ef0:0 in _read_sys
   +0x30 () from /usr/lib/hpux64/libc.so.1
 
這是1個死鎖的例子,可以看到執行緒9 和執行緒2都停在 __ksleep上。
如果想看各個執行緒的詳細堆疊資訊,比如要看9的
gdb)thread 9
把當前執行緒設成9,然後就可以檢視相關資訊
比如
gdb)bt
將列出棧的呼叫情況,以及對應原始碼中的位置,此時謹慎察看對應程式碼,一般必有結果