gdb是非常強大的unix及unix-like下的程式除錯工具
gdb的使用:
r或run:執行程式。
list/l 行號:顯示檔案源**,接著上次的位置往下列,每次列10行。
list/l 函式名:列出某個函式的源**。
s或step:進入函式呼叫
breaktrace(或bt):檢視各級函式調⽤用及引數
info(i) locals:檢視當前棧幀區域性變數的值
info break :檢視斷點資訊。
finish:執⾏行到當前函式返回,然後挺下來等待命令
print(p):列印表示式的值,通過表示式可以修改變數的值或者調⽤用函式
set var:修改變數的值
quit:退出gdb
break(b) 行號:在某一行設定斷點
break 函式名:在某個函式開頭設定斷點
continue(或c):從當前位置開始連續而非單步執行程式
run(或r):從開始連續而非單步執行程式
delete breakpoints:刪除所有斷點
delete breakpoints n:刪除序號為n的斷點
disable breakpoints:禁用斷點
enable breakpoints:啟用斷點
info(或i) breakpoints:參看當前設定了哪些斷點
display 變數名:跟蹤檢視乙個變數,每次停下來都顯⽰示它的值
undisplay:取消對先前設定的那些變數的跟蹤
until x(行號):跳至x行
n 或 next:單步執行。
p 變數:列印變數值。
預設情況下,gdb只會除錯主程序,但是我們可以在除錯之初通過兩條命令來設定除錯多執行緒
如果引數是on,表示除錯的時候要分離程序,只能除錯其中乙個程序;若引數為off,表示除錯的時候不分離程序,進行阻塞式除錯,即除錯父程序時阻塞子程序,除錯子程序時阻塞父程序。當然,還可以切換需要進行除錯的程序。
切換除錯程序:
- inferior < infer num>
檢視正在除錯的程序:
- info inferiors
確定除錯哪個程序:
先編寫乙個簡單的多程序程式,接下來我們就可以開始除錯了。
先看看set detach-on-fork off的情況:
fork()之後,可以檢視到目前有兩個正在除錯的程序,預設除錯父程序,但是我們可以隨意切換。
再來看看set detach-on-fork on的情況:
fork()之後,只有乙個正在除錯的程序,因為子程序被分離出去了(這是預設情況,也可以通過設定分離父程序)。
1) 顯示當前可調式的所有執行緒:
gdb為每乙個執行緒分配id,這個id後續操作的時候進行使用。
2)切換當前除錯的執行緒為id號執行緒:
3)讓執行緒執行某個命令:
只讓id號執行緒執行command命令
讓所有執行緒都執行command命令4)
在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,通過這個命令就可以就可以實現這個要求,off是不鎖定任何執行緒,也就是所有的執行緒都執行,這個是預設值。on是只有當前執行緒執行。step是在單步的時候,除了next過乙個函式的情況意外,只有當前執行緒會執行。
gdb除錯多程序多執行緒
1.除錯多程序預設設定下,在除錯多程序程式時gdb只會除錯主程序。但是gdb v7.0 支援多程序的 分別以及同時 除錯,換句話說,gdb可以同時除錯多個程式。只需要設定follow fork mode 預設值 parent 和detach on fork 預設值 on 即可。接下來,首先介紹一下f...
GDB 除錯多執行緒多程序
gdb是linux下的除錯利器,在c c 程式開發過程中必不可少的。這裡總結一下多程序和多執行緒的除錯方法和技巧。多程序的除錯 如下示例 include include include include include include static int glob 23 void test int ...
GDB除錯多執行緒 多程序
用gdb除錯多程序程式 如果乙個程序通過fork系統呼叫建立了子程序,gdb會繼續除錯原來的程序,子程序則正常執行。那麼該如何除錯子程序呢?單獨除錯子程序 子程序從本質上說也是乙個程序,因此我們可以用通用的gdb除錯方法來除錯他。舉例來說如果要除錯乙個伺服器中的某乙個子程序,我們可以先執行伺服器,然...