gdb除錯任意函式

2022-05-02 20:54:12 字數 1391 閱讀 8323

使用gdb除錯時,有的函式只在某些路徑上會執行到,而觸發這些路徑執行的條件構造起來比較麻煩,比如某個server在接收到read請求時,會呼叫do_read進行響應,這時如果我們想除錯do_read函式,就必須在客戶端構造乙個read請求來觸發。

int do_read(const readrequest& req);
假設我們知道do_read呼叫時引數readrequest的具體內容,能否直接使用gdb顯式的除錯do_read,且看下面這個例子。

main函式裡沒有顯式呼叫get_capacity函式,如果我們想要除錯這個函式,最直觀的一種方式,當然是將get_capacity加到main裡,讓其出現在呼叫路徑中即可除錯。

gdb的jump可以讓程式跳轉到任意位置執行,實驗了一下,結果是跳轉到get_capacity裡開始執行時,出現segmentation fault,因為引數box的空間沒有分配。在了解引數傳遞順序及棧布局的情況下,可通過一些出棧、入棧操作,在jump到get_capacity前將引數先準備好,這樣get_capacity呼叫時,就不會有問題,但這樣做太過複雜。

struct box ;

int get_capacity(const struct box& box)

int main()

gdb的call可以在除錯時顯式呼叫函式,需要先把引數準備好。如下所示,在main裡設定斷點,然後分配出乙個box的記憶體,並對box進行賦值,最後將其最為引數傳遞給get_capacity函式,get_capacity函式被正確的呼叫,通過在get_capacity設定斷點即可對它進行除錯。

(gdb) set $box = (box*)malloc(sizeof(box))

(gdb) set $box->length = 3

(gdb) set $box->width = 4

(gdb) set $box->height = 5

(gdb) call get_capacity(*$box)

box capacity: 60

$1 = 60

針對上面這種方式,存在兩個疑問,求達人解惑。

直接使用box物件而不是指標時,傳遞時有問題,如下:

(gdb) set $box = *(box*)malloc(sizeof(box))

(gdb) call get_capacity($box)

attempt to take address of value not located in memory.

不能直接使用new來構造物件,對於複雜的類(尤其是擁有虛函式的情況),上面的方式沒辦法工作。

(gdb) set $box = new box()

a syntax error in expression, near `new box()'.

gdb除錯(檢視函式棧 除錯coredump檔案)

檢視函式棧用在gdb中用bt,觀察變數值用watch 變數值發生變化時會暫停程式的執行 一 除錯coredump檔案 什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.一般以core.程序號的檔案呈現,可以知己設定,這個檔案便是作業系統把程式down掉時的記憶體內容扔...

gdb 除錯 vs除錯

一 先要生成二進位制檔案 g g 1.cpp o 1.out g引數不要省,不然 gdb l 引數用不了 二 引數 設定斷點 設定 函式斷點break func 在某行設定斷點break 7 檢視斷點資訊 info break 刪除斷點 d 刪除所有斷點 d 3 刪除第三個 執行 r 下一步 n 逐...

GDB除錯命令以及GDB除錯段錯誤

一 gdb的除錯命令。c語言是 cc g tst.c o tst c 是g g o 生成的檔案 file.cpp c 除錯程式命令 gdb file 啟動,羅列 行數ist 1,break 行數 info break,run r 除錯執行,step s 單步除錯,檢視變數 print p 變數名,檢...