**:
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...