我們這裡仍舊將gdb的基本操作在這裡羅列一下:
•list(l)行號:顯示源**。一次顯示10行
•list(l)函式名:列出某個函式的源**
•r或run:執行程式
•s或step:進入函式呼叫
•breaktrace(bt):檢視函式呼叫棧
•info(i) locals:檢視當前棧幀區域性變數的值
•info break :檢視斷點資訊
•finish:執行到當前函式返回,然後停下來等待命令
•print(p):列印表示式的值
•set var:修改變數的值
•quit(q):退出gdb
•break(b) 行號:在某一行設定斷點
•break 函式名:在某個函式開頭設定斷點
•continue(c):從當前位置開始連續而非單步執行程式
•run(r):從開始連續而非單步執行程式
•delete(d)break:刪除所有斷點
•delete(d)break n:刪除序號為n的斷點
•disable break:禁用斷點
•enable break:啟用斷點
•info(i) break:參看當前設定了斷點
•next(n):單條執行
在linux下預設是可以除錯多執行緒的。接下來,我們先寫簡單的測試用例。
#include
#include
void* thread1(void* arg)
void* thread2(void* arg)
void* thread3(void* arg)
int main()
這裡建立了三個執行緒,所以加上主線程,總共四個執行緒。在gdb下,預設是可以進行多執行緒的除錯的。這與程序不同,所以不需要設定任何選項。我們這時候開始對測試**進行gdb除錯。首先我們先進入gdb除錯模式。然後list檢視原始碼。這裡不再贅述。我們這裡先在第30行打斷點。這個時候剛剛建立完執行緒一,此時程序中有兩個執行緒(主線程與執行緒一)。
打完斷點之後,我們可以用指令run(r)讓程序跑起來,此時到達斷點。已執行完建立第乙個執行緒的**。這個時候我們用指令info threads
來檢視當前可除錯的執行緒。發現分別有兩個編號為1與2的執行緒。
此時*
代表正在除錯的執行緒。編號為gdb編號,與我們的執行緒id並沒有關係,這個編號是為了方便與我們除錯的時候切換想要除錯的執行緒。這時候我們再對31行進行打斷點。同樣用info threads
來檢視一下。
這個時候我們發現,可調式的執行緒變成了一號與三號,這是為什麼?原因是上面執行緒一已經跑完了,所以在程序內部已經沒有了執行緒一。所以只剩下兩個執行緒,主線程與執行緒二。執行緒二的編號為3。我們假如要切換除錯執行緒,可以用thread
加執行緒編號,來進行切換。
切換完畢後,我們再用info threads
進行檢視,這個時候*
在我們切換的執行緒編號旁邊,也就是說,現在除錯的是編號為三的執行緒。
在我們可以切換要除錯的執行緒的時候,我們就可以對任意執行緒進行除錯。
linux gdb 除錯多執行緒
最近遇到乙個問題,乙個程序裡啟用了多執行緒,然後乙個執行緒掛掉了,產生了coredump檔案,但是gdb無法跟蹤到是哪乙個執行緒,沒辦法只能重新跑一邊,gdb當前程序,加入斷點,看運 況,步驟如下 1 top 檢視正在執行的程式 2 啟動gdb,attach 需要除錯的程序pid 或者知道程序的名字...
linux gdb 除錯多執行緒
1 用 kill 命令產生 core dump檔案 kill 11 pid 用訊號11殺掉它,會讓程序產生乙個 segmentation fault,從而產生乙個 core dump,得到乙個 core 檔案,裡面包含了死鎖的時候,程序的記憶體映象。其中訊號11表示 sigse sigse 是當乙個...
linux gdb 除錯多執行緒 單獨除錯執行緒
linux gdb 除錯多執行緒 單獨除錯執行緒 2011年01月26日 星期三 下午 06 10 一 多執行緒除錯 多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令 info thread 檢視當前程序的執行緒。thread 切換除錯的執行緒為指定id的執行緒。break file.c 1...