二、資訊顯示
三、斷點
四、其他參考
當以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 變數名,檢...