前言
gdb除錯不同於介面化的除錯,雖然命令非常簡單,但上手比較有難度。對於從沒使用過gdb的人來說,可以考慮裝乙個python外掛程式(gef),當然也可以不裝,只是為了方便顯示除錯資訊而已。會使用gdb的可以直接跳到後面閱讀(附有gdb操作命令)外掛程式安裝步驟
以普通使用者身份, 進入使用者目錄
cd ~
安裝gef外掛程式(必須gdb7.7以上)
wget -q -o- | sh
將程式編譯為可以被gdb除錯的版本(-g 為程式加上符號表)
gcc -g program.c -o program
檢視符號表
readelf -s program
gdb有多種啟動方式
1.本地普通啟動
gdb 2.attach到某個程序啟動
gdb attach 3.使用本地core檔案啟動
gdb core
4.遠端啟動
gdb server 0.0.0.0:1234 /path/to/file
命令簡寫
命令全拼含義l
list
顯示程式
bbreak
設定斷點
ccontinue
到下乙個斷點
nnext
下一行(不進入函式內部)
sstep
下一行(進入函式內部)
uuntil
完成當前迴圈體
ffinish
完成當前函式
p/fprint
列印x/nfu
examine
檢視記憶體
btbacktrace
函式呼叫堆疊
-set args
設定函式引數
-set listsize
設定每次顯示行數
i binfo breakpoints
顯示斷點資訊
i finfo frame
顯示棧內資訊
i rinfo registers
顯示暫存器資訊
i lo
info locals
顯示區域性變數資訊
qquit退出-
shell
使用shell命令
命令使用技巧
設定函式引數
set args 20
設定gdb資訊顯示視窗的行數
set listsize 20
條件斷點的設定
b 20 if (i>5)
修改記憶體
p i=20
列印具體長度的值
p inumber@20
操作斷點
disable 1
enable 1
delete 1
設定觀察點-觀察的記憶體發生改變(硬體斷點)
watch 0x0000
設定捕捉點
catch event
event可以是以下:
1.throw 丟擲乙個c++的異常 catch throw
2.catch 捕捉乙個c++的異常 catch catch
3.exec 呼叫系統呼叫exec時停止 catch exec
4.fork 呼叫系統呼叫fork時停止 catch fork
5.load/load libname 載入動態鏈結庫時 catch load / catch load libname
6.unload
x命令的引數(檢視記憶體)
x/n,f,u
n 是乙個正整數,表示顯示記憶體的長度
f 表示顯示的格式(與print一致)
u 表示從當前位址往後請求的位元組數(gdb預設為4byte)
源**中搜尋
全部搜尋
reverse-search
向前搜尋
forward-search
搜尋(記憶體搜尋)
search
gdb多執行緒、多程序除錯可以參考下篇
GDB除錯基礎
breakpoint 2,func n 250 at tst.c 5 5 int sum 0,i gdb n 6 for i 1 i n i gdb p i 列印變數i的值,print命令簡寫。1 134513808 gdb n 8 sum i gdb bt 檢視函式堆疊。0 func n 250 ...
GDB除錯基礎
要使用gdb除錯,gcc編譯時要加上 g 選項,這樣生成的可執行檔案才能被gdb除錯。基礎指令 l list 表示檢視源 後可跟數字num如 l num,表示檢視 的位置。b break 表示設定斷點的位置。b 20 if i 5,用此種方式設定條件斷點,即當for迴圈到i 5時才中斷。delete...
gdb除錯初學 1
菜鳥在寫c程式的時候最害怕就是遇到segmentation fault core dumped 遇到段錯誤可以嘗試從gdb除錯來分析core檔案從而定位問題 然而,預設情況下是不生成core檔案的,至少在我的ubuntu上,可執行程式的路徑下就沒有生成core file。檢視ulimit a 得到如...