gdb除錯小結

2021-08-19 22:46:30 字數 3937 閱讀 5064

二、資訊顯示

三、斷點

四、其他參考

當以gdb方式啟動gdb後,gdb會在path路徑和當前目錄中搜尋的原始檔。如要確認gdb是否讀到原始檔,可使用l或list命令,看看gdb是否能列出源**。

使用(gdb)r或run命令執行程式。

>gdb -p :pid是程序id,可以通過`>ps aux | grep 《程式名》 `獲得。

或者直接 >gdb -p `pidof 《程式名》` 也可以。

(gdb) attach
(gdb) detach
不管是操作轉儲檔案還是用gdb設定斷點進行除錯,都可以輸入(gdb)bt列印棧內容進行檢視。一般的當機bug,看下當機的位置,然後看下源**基本就可以解決了。但是很多情況下簡單的(gdb)bt還查不到問題,這時候就要涉及到比較複雜的操作。下面羅列了一些對棧的操作:

(gdb) bt:顯示所有棧幀,backtrace。

(gdb) bt 10:顯示前面10個棧幀。

(gdb) bt -10:顯示後面10個棧幀。

(gdb) bt full:顯示棧幀以及區域性變數。

(gdb) bt full 10:顯示前面10個棧幀以及區域性變數。

(gdb) bt full -10:顯示後面10個棧幀以及區域性變數。

(gdb) frame 《棧幀編號》:進入指定的棧幀中,然後可以檢視當前棧幀中的區域性變數,以及棧幀內容等資訊。

(gdb) info frame 《棧幀編號》:可以檢視指定棧幀的詳細資訊。

(gdb) up:進入上層棧幀。

(gdb) down:進入下層棧幀。

除錯bug過程中檢視變數資訊是很有幫助的操作,檢視方式如下:

(gdb) p 《變數名》

(gdb) set variable 《變數》 = 《表示式》:將變數的值設定為指定表示式的值。例如 set variable x=10

(gdb) print 《變數》 = 《表示式》:檢視並修改變數

(gdb) `info reg`:顯示所有暫存器。可以簡寫為:i r。如果要檢視具體的暫存器可以這樣:`i $ebx`

(gdb) `p $eax`:顯示eax暫存器內容。

(gdb) `p/c $eax`:用字元顯示eax暫存器內容

反斜槓後面的是顯示格式,可使用的格式見下表:該錶在顯示記憶體內容的x命令中也是通用的。

格式說明

x顯示為十六進製制數

d顯示為十進位制數

u顯示為無符號十進位制數

o顯示為八進位制數

t顯示為二進位制數

a顯示為位址

c顯示為字元(ascii)

f顯示為浮點小數

s顯示為字串

i顯示為機器語言(僅在顯示記憶體的x命令中可用)

(gdb) `x $pc`:顯示程式指標指向位置的內容。

(gdb) `x/i $pc`:顯示程式當前位置的彙編指令。

(gdb) `x/10i $pc`:顯示程式當前位置開始往後的10條彙編指令。

(gdb) `disassem $pc`:反彙編當前函式。簡寫為:`disas $pc`。

(gdb) `list `:顯示程式第linenum行的周圍的源程式。

(gdb) `list `:顯示函式名為function的函式的源程式。

(gdb) list :顯示當前行後面的源程式。

(gdb) list - :顯示當前行前面的源程式。

(gdb)set print pretty on:如果開啟printf pretty這個選項,那麼當gdb顯示結構體時會比較漂亮。

(gdb)set print array on:開啟陣列顯示,開啟後當陣列顯示時,每個元素佔一行,如果不開啟的話,每個元素則以逗號分隔。

(gdb) break 《函式名》:對當前正在執行的檔案中的指定函式設定斷點。可簡寫為:(gdb) b 《函式名》

(gdb) break 《行號》:對當前正在執行的檔案中的特定行設定斷點。可簡寫為:(gdb) b 《行號》

(gdb) break 《檔名:行號》:對指定檔案的指定行設定斷點。最常用的設定斷點方式。可簡寫為:(gdb) b 《檔名:行號》

(gdb) break 《檔名:函式名》:對指定檔案的指定函式設定斷點。可簡寫為:(gdb) b 《檔名:函式名》

(gdb) break <+/-偏移量》:當前指令行+/-偏移量出設定斷點。可簡寫為:b <+/-偏移量》

(gdb) tbreak 《函式名》:設定臨時斷點,只生效一次。可簡寫為:(gdb) tb 《函式名》

(gdb) info break :顯示所有斷點以及監視點。可簡寫為:(gdb) i b

(gdb) delete 《編號》:刪除編號指向的斷點或者監視點。可簡寫為:(gdb) d 《編號》

(gdb) clear 《行號》:刪除改行的斷點。

(gdb) clear 《檔名:行號》:刪除改行的斷點。

(gdb) disable 《斷點編號》 : 當前斷點設定為無效。

(gdb) enable 《斷點編號》:當前斷點設定為有效。

在除錯程式過程中,有時候我們只想在某個條件下停止程式,然後進行單步除錯,而條件斷點就是為此而設計。下面是條件斷點的操作方式:

(gdb) b 《斷點》 if 《條件表示式》 : 例如:b main.cpp:8 if x=10 && y=10

(gdb) condition 《斷點編號》:刪除該斷點的條件。

(gdb) condition 《斷點編號》 《條件表示式》:修改斷點條件。例如:condition 1 x=10 && y=10

可以監視某個變數,在變數被訪問或者被修改時程式會在當前點進入斷點。刪除,檢視監視點的方式與斷點相同。設定監視點方式如下:

(gdb) watch 《表示式》:表示式發生變化時暫停。

(gdb) awatch 《表示式》:表示式訪問或者改變時暫停。

(gdb) rwatch 《表示式》:表示式被訪問時暫停。

(gdb) info watchpoints:列出當前所設定的所有觀察點。

每次斷點發生時候,想要檢視的變數很多時,如果每個變數都手動print則需要浪費很多時間。斷點命令可以在斷點發生時批量執行gdb命令。下面是斷點命令的設定方式:

(gdb) commands 《斷點編號》

(gdb) >print x

(gdb) >print y

(gdb) >end

首先輸入gdb命令commands 《斷點編號》然後回車,這時候會出現》提示符。出現》提示符後可以輸入斷點發生時需要執行的gdb命令,每行一條,全部輸入完成後輸入end結束斷點命令。

如果你的除錯斷點在某個函式中,並還有語句沒有執行完。你可以使用return命令強制函式忽略還沒有執行的語句並返回。

return

return

使用return命令取消當前函式的執行,並立即返回,如果指定了,那麼該表示式的值會被認作函式的返回值。

call
表示式中可以一是函式,以此達到強制呼叫函式的目的。並顯示函式的返回值,如果函式返回值是void,那麼就不顯示。

另乙個相似的命令也可以完成這一功能——print,print後面可以跟表示式,所以也可以用他來呼叫函式,print和call的不同是,如果函式返回void,call則不顯示,print則顯示函式返回值,並把該值存入歷史資料中。

100個gdb小技巧

gdb偵錯程式使用總結

陳皓-用gdb除錯程式

gdb除錯小結

gdb 最基本的除錯命令.1以除錯程式test.cpp 為例 進入除錯環境 gdb test 2.b 12 在檔案的第12 行設定斷點。刪除斷點 info b 列出所有的斷點資訊 gdb info b num type disp enb address what 1 breakpoint keep ...

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 變數名,檢...