GDB常用命令
info reg:查看寄存器狀態。
info locals:查看局部變量
info line n:顯示第n行代碼在內存中的對應位置
r:運行
n:單步執行
s:單步調試,可以跟蹤進函數。
c:繼續運行
b n:在第n行設置斷點
info b:顯示所有斷點
clear n:清除第n行斷點
clear:清除所有斷點
list <linenum>:顯示程序第linenum行周圍的源程序
list <function>:顯示函數名爲function的函數的源程序
list:顯示當前行後面的源程序。
list - :顯示當前行前面的源程序。
print <expr>
print /<f> <expr>
<expr>是表達式,是被調試的程序中的表達式,<f>是輸出的格式,比如,如果要把表達式按16進制的格式輸出,那麼就是/x
watch <expr>:一般來觀察某個表達式(變量也是一種表達式)的值是否有變化了,如果有變化,馬上停住程序。
disassemble:命令用於反彙編,它可被用來查看當前執行時的源代碼的機器碼,其實際上只是把目前內存中的指令dump出來。下面的示例用於查看函數func的彙編代碼:
(gdb) disassemble func
bt或Backtrace:打印當前的函數調用棧的所有信息。如:
(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
從上可以看出函數的調用棧信息:__libc_start_main --> main() --> func()
backtrace <n>, bt <n> n是一個正整數,表示只打印棧頂上n層的棧信息。
frame 或 f:查看當前棧層的信息,會打印出這些信息:棧的層編號,當前的函數名,函數參數值,函數所在文件及行號,函數執行到的語句。
info frame或info f 這個命令會打印出更爲詳細的當前棧層的信息,只不過,大多數都是運行時的內內地址。比如:函數地址,調用函數的地址,被調用函數的地址,目前的函數是由什麼樣的程序語言寫成的、函數參數地址及值、局部變量的地址等等。如:
(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame's sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8
info args:打印出當前函數的參數名及其值。
x /nfu 0x<addr>:查看內存地址中的值。
l n表示要顯示的內存單元的個數
l f表示顯示方式, 可取如下值
u x 按十六進制格式顯示變量。
u d 按十進制格式顯示變量。
u u 按十進制格式顯示無符號整型。
u 按八進制格式顯示變量。
u t 按二進制格式顯示變量。
u a 按十六進制格式顯示變量。
u i 指令地址格式
u c 按字符格式顯示變量。
u f 按浮點數格式顯示變量。
l u表示一個地址單元的長度
u b表示單字節,
u h表示雙字節,
u w表示四字節,
u g表示八字節