gdb除錯多程序多執行緒

2021-08-07 04:12:15 字數 1952 閱讀 6263

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除錯方法來除錯他。舉例來說如果要除錯乙個伺服器中的某乙個子程序,我們可以先執行伺服器,然...