啟動和退出GDB
GDB(GNU Project Debugger)幾乎適用於所有類Unix系統,小巧方便且不失功能強大,Linux/Unix程序員經常用它來調試程序。
總的來說有幾下幾種方法啟動GDB
gdb(不加任何參數),如果不希望打印授權信息加上-silent參數
gdb 可執行文件
gdb 可執行文件的core文件
gdb 正在運行的進程之pid
要退出GDB則有兩種方法
quit
ctrl+d
命令表(記憶)
斷點相關命令
GDB命令 參數 意義 常用示例
break 地址 下斷點,可簡寫為b。地址類型包括:函數名、源文件行號、*內存地址 break main、break 12、break *0x08048373
watch 表達式 表達式的值被改變程序將立即停止運行 watch *((int*)0x80d1ba8)
clear 地址 和break相反,清除指定地址上的斷點 clear main、clear 12、clear *0x08048373
info break 顯示斷點信息,包括所有斷點的編號、種類、使能狀態、地址以及位置 info break
disable 斷點編號 禁用一個斷點 disable 1
enable 斷點編號 啟用一個被禁用的斷點 enable 1
delete 斷點編號 刪除一個斷點,可簡寫為d delete 1
執行相關命令
GDB命令 參數 意義 常用示例
run 命令行參數 運行程序,可簡寫為r run vuln
attach 進程號 調試已運行的進程 attach 1022
continue 次數(可選) 繼續執行,可簡寫為c c 4
next 次數(可選) 單步(不進入函數調用),可簡寫為n n 4
step 次數(可選) 單步(進入函數調用),可簡寫為s s 4
unitl 源文件行號 執行到執行地址后中斷,可簡寫為u u 18
finish - 運行當前函數直到函數退出 -
return - 立即退出當前函數 -
信息查看相關命令
GDB命令 參數 意義 常用示例
info reg、break、file、args、frame、functions 顯示各種信息,info可簡寫為i info reg
backtrace 幀的數目 顯示當前函數調用棧信息,可簡寫為bt bt
print /f exp,其中f表示修飾,exp為表達式,print可簡寫為p 顯示表達式的值,格式有:x(十六進制)、c(字符)等,print可簡寫為p p/c 0x41、p/x 1024、p str、p/x $eax
x /nfu addr,其中n表示個數、f表示格式、u表示單元大小,如果沒有制定地址則接着上一次x命令顯示之后的地址 顯示指定地址內容,格式有:x(十六進制)、s(字符串)、i(指令)等,單元大小有b、h、w、g、b為一個字節,依次比前一個大一倍 x/4i $pc、x/16xb $sp、x/s *(argv+1)、x/s 0xbffffc52
list 行號、函數或地址 如果調試的是帶符號編譯的程序,那么list命令可以列出程序源碼,list可簡寫為l l file.c:19
disass 函數名 反匯編指定函數,默認為當前函數 disass main
其它常用命令
GDB命令 參數 意義 常用示例
set set的參數非常多,具體參見help set 設置值 set var=4、set {int}0xbffffc52=50、set {int}($esp+4)=$eip
shell 外部shell命令 執行外部shell命令 shell ps -ef
比較常用的命令如p、x、disass 、break、si、ni、c、finish、set,美中不足的是GDB沒有內置搜索內存的功能,我們可以自定義一個宏腳本並保存在用戶目錄的.gdbinit文件里即可。
查看局部變量
info local
查看內存地址和棧中的值
gdb查看指定地址的內存地址的值:examine 簡寫 x-----使用gdb> help x 來查看使用方式
x/ (n,f,u為可選參數)
n: 需要顯示的內存單元個數,也就是從當前地址向后顯示幾個內存單元的內容,一個內存單元的大小由后面的u定義
f:顯示格式
x(hex) 按十六進制格式顯示變量。
d(decimal) 按十進制格式顯示變量。
u(unsigned decimal) 按十進制格式顯示無符號整型。
o(octal) 按八進制格式顯示變量。
t(binary) 按二進制格式顯示變量。
a(address) 按十六進制格式顯示變量。
c(char) 按字符格式顯示變量。
f(float) 按浮點數格式顯示變量
u:每個單元的大小,按字節數來計算。默認是4 bytes。GDB會從指定內存地址開始讀取指定字節,並把其當作一個值取出來,並使用格式f來顯示
b:1 byte h:2 bytes w:4 bytes g:8 bytes
比如x/3uh 0x54320表示從內存地址0x54320讀取內容,h表示以雙字節為單位,3表示輸出3個單位,u表示按照十六進制顯示。
from http://www.cnblogs.com/super119/archive/2011/03/26/1996125.html
gdb打印表達式的值:print/f 表達式
f是輸出的格式,x/d/u/o/t/a/c/f
表達式可以是當前程序的const常量,變量,函數等內容,但是GDB不能使用程序中所定義的宏
查看當前程序棧的內容: x/10x $sp-->打印stack的前10個元素
查看當前程序棧的信息: info frame----list general info about the frame
查看當前程序棧的參數: info args---lists arguments to the function
查看當前程序棧的局部變量: info locals---list variables stored in the frame
查看當前寄存器的值:info registers(不包括浮點寄存器) info all-registers(包括浮點寄存器)
查看當前棧幀中的異常處理器:info catch(exception handlers)