GDB 除錯多執行緒

2021-07-02 20:50:28 字數 2171 閱讀 1966

**:

gdb是*nix下常用的除錯工具,可以提供及其複雜的除錯功能,功能十分強大。這裡展示一下gdb除錯多執行緒的常規方法。

常用命令:

info threads :顯示當前可以除錯的所有執行緒。

thread idx : idx請用上述命令中的執行緒id替換,該命令用於切換被除錯的執行緒,請注意gdb只能除錯乙個執行序列,也就乙個傳統意義上的程序

break file.c:20 thread all:在file.c中的第20行,為所有經過這裡的執行緒設定斷點

set scheduler-locking off|on|step:執行緒之間是並行執行的,step之類的命令會對所有執行緒生效。該命令就是提供了一種只對單一執行緒生效的解決方式。選項off表示不鎖定任何程序,也就是預設情況。on表示命令只對當前執行緒生效。step表示在單步的時候,除了next過乙個函式的情況以外,只對當前執行緒執行。

使用舉例:

應用1,下面**會產生coredump,我們除錯之。

[cpp]view plain

copy

#include 

#include 

inta(

void

)  int

b()  

intc()  

void

*mythread1(

void

)    

pthread_exit(0);  

}  void

*mythread2(

void

)    

pthread_exit(0);  

}  int

main()  

ret = pthread_create(&thread_id2, null, (void

*)mythread2, null);  

if(ret)  

pthread_join(thread_id1, null);  

pthread_join(thread_id2, null);  

return

0;  

}  

編譯之 gcc pthread_gdb.c -g  -lpthread

執行會提示segment錯誤,並提示產生coredump。但是卻沒有產生。需要執行ulimit -c unlimited。再執行一次,才真正的產生了coredump檔案。

執行gdb a.out corefile 並執行bt檢視執行backtrace,顯示第49行執行錯誤。也就是初步懷疑執行緒1執行有問題。

執行gdb a.out

(gdb) b 49

(gdb) thread 2 //主線程是1

(gdb) c

之後發現執行緒2工作正常,同理對執行緒2,也正常。按理pthread_join()是庫函式不應該有問題,仔細檢查發現,xx的筆誤。這裡提供了單獨除錯執行緒的方法,各位可以一試。

應用2,**是修正筆誤的上述**,這裡假設上述**已經處於執行狀態,但是跑飛了,需要確定各執行緒執行位置。

[cpp]view plain

copy

gdb a.out   pid -- pid是執行的程序號  

(gdb) thread

2  (gdb) bt  

#0  0x00855416 in __kernel_vsyscall ()

#1  0x00bf1086 in nanosleep () from /lib/libc.so.6

#2  0x00bf0ea4 in sleep () from /lib/libc.so.6

#3  0x08048516 in a () at pthread_gdb.c:5

#4  0x08048528 in b () at pthread_gdb.c:10

#5  0x0804853a in c () at pthread_gdb.c:15

#6  0x08048571 in mythread1 () at pthread_gdb.c:26

#7  0x00cede99 in start_thread () from /lib/libpthread.so.0

#8  0x00c2cd2e in clone () from /lib/libc.so.6

可以看出執行緒1的backtrace,正在執行函式a中的sleep呢。  

gdb多執行緒除錯

先介紹一下gdb多執行緒除錯的基本命令。info threads顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的執行緒。thread id切換當前除錯的執行緒為指定id的執行緒。break thread test.c 12...

gdb 除錯多執行緒

設定core環境 uname a 檢視機器引數 ulimit a 檢視預設引數 ulimit c 1024 設定core檔案大小為1024 ulimit c unlimit 設定core檔案大小為無限 多執行緒如果dump,多為段錯誤,一般都涉及記憶體非法讀寫。可以這樣處理,使用下面的命令開啟系統開...

gdb 多執行緒除錯

推薦閱讀 先介紹一下gdb多執行緒除錯的基本命令。info threads顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的執行緒。thread id切換當前除錯的執行緒為指定id的執行緒。break thread test...