gdb除錯 基礎(1)

2021-09-19 19:10:55 字數 2357 閱讀 6046

前言

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 得到如...