1.列出源程序
(gdb) l(list) <line> //列出(line-5)行到(line-1+5)行間的內容
(gdb) l(list) <line1,line2> //列出(line1)行到(line2)行間的內容
2.運行程序
(gdb) r(run) <arg1,arg2,...,argn> //若“不列出參數”,則使用“上次輸入參數”
(gdb) show args //查看當前使用“參數”
(gdb) set args <arg1,arg2,...,argn> //設置當前使用“參數”
3.斷點操作
(gdb) b(break) <line> //在執行到第line行時中斷
(gdb) b(break) <func> //在執行func時中斷
(gdb) b(break) <id> if <exp> //在exp成立時設置斷點
(gdb) b(break) <file:line> //在文件file的第line行設置斷點
(gdb) info break //查看斷點信息
(gdb) d(delete) breakpoint <point> //刪除第point號斷點
(gdb) enable breakpoint <point> //使能第point號斷點
(gdb) disable breakpoint <point> //禁用第point號斷點
(gdb) clear //刪除所有斷點
(gdb) clear <line> //刪除第line行上的所有斷點
(gdb) watch <exp> //當exp成立時觸發中斷,輸出觀察點信息
4.觀察運行數據
(gdb) p(print) <var> //打印變量var的值
(gdb) p(print) <file::var> //打印變量var的值
(gdb) p(print) <func::var> //打印變量var的值
(gdb) p(print) *array@end //打印數組array從0號到end-1號元素的值
(gdb) p/x <var> //以“十六進制”打印變量var的值
(gdb) p/d <var> //以“十進制”打印變量var的值
(gdb) p/u <var> //以“十進制無符號數”打印變量var的值
(gdb) p/o <var> //以“八進制”打印變量var的值
(gdb) p/t <var> //以“二進制”打印變量var的值
(gdb) p/a <var> //以“十六進制”打印變量var的值
(gdb) p/c <var> //以“字符格式”打印變量var的值
(gdb) p/f <var> //以“浮點數”打印變量var的值
5.查看內存
(gdb) x(examine) /nfu <addr>
//數量n 顯示n個單位的內存內容
//格式f s:字符串,i:指令,其他與print相同
//單位u b:1,h:2,w:4,g:8
6.自動顯示變量
(gdb) display /f <var> //格式f 與examine相同
(gdb) info display //顯示所有自動顯示的變量信息
(gdb) display //刪除所有自動顯示變量
(gdb) delete display <dnums> //刪除編號爲dnums的自動顯示變量
(gdb) enable display <dnums> //使能第dnums號自動顯示變量
(gdb) disable display <dnums> //禁用第dnums號自動顯示變量
7.顯示變量的歷史記錄
(gdb) printf $n //顯示第n個歷史記錄的值
8.查看寄存器
(gdb) info registers //顯示所有寄存器(不包括浮點寄存器)的值
(gdb) info all-registers //顯示所有寄存器(包括浮點寄存器)的值
(gdb) info registers <reg> //顯示寄存器reg的值
9.查看gdb的環境變量
set $var=i
show convenience
10.改變程序執行
10.1 修改變量的值
print/set i=30
10.2 跳轉執行
jump <location>
set $pc=0x45
10.3 信號的產生及處理
signal <signum>
handle <sig-name> <whattodo> //whattodo: nostop stop print noprint pass nopass
10.4 強制調用函數
call func(arg1,arg2,...)
10.5 強制函數返回
return <value>
11.機器碼與計算機構造
11.1 產生core文件
gdb exe core
11.2 跟蹤棧上數據
bt(backtrace)
frame n
info locals
11.3 綁定運行進程
gdb exe pid
detach
attach pid
11.4 源文件搜索
search regexp //向下搜索匹配行
reverse-search regexp //向上搜索匹配行
print $_ //打印匹配行號
11.5 機器語言工具
$ip 當前指令地址
$pc 當前指令內容
$fp 幀指針
$sp 棧指針
$ps 處理器狀態
info line n //打印行n在內存中的位置
disassemble func //查看函數func的反彙編
12.調試多進程程序
12.1 follow-fork-mode
在2.5.60版Linux內核及以後,GDB對使用fork/vfork創建子進程的程序提供了follow-fork-mode選項來支持多進程調試:
set follow-fork-mode [parent|child]
- parent: fork之後繼續調試父進程,子進程不受影響。
- child: fork之後調試子進程,父進程不受影響。
detach-on-fork參數,指示GDB在fork之後是否斷開(detach)某個進程的調試,或者都交由GDB控制:
set detach-on-fork [on|off]
- on: 斷開調試follow-fork-mode指定的進程。
- off: gdb將控制父進程和子進程,follow-fork-mode指定的進程將被調試,另一個進程置於暫停(suspended)狀態。
12.2 Attach子進程
- attach 命令:附着(attach)到正在運行的進程
12.3 GDB wrapper
- 很多時候,父進程 fork 出子進程,子進程會緊接着調用 exec族函數來執行新的代碼。對於這種情況,我們也可以使用gdb wrapper 方法。它的優點是不用添加額外代碼。
12.4 小結
上述三種方法各有特點和優劣,因此適應於不同的場合和環境:
- follow-fork-mode方法:方便易用,對系統內核和GDB版本有限制,適合於較爲簡單的多進程系統
- attach子進程方法:靈活強大,但需要添加額外代碼,適合於各種複雜情況,特別是守護進程
- GDB wrapper方法:專用於fork+exec模式,不用添加額外代碼,但需要X環境支持(xterm/VNC)。
其他
pwd
cd
quit
shell [cmdline]
show language
info frame
info source
set language
(gdb) set debug-file-directory
(gdb) show debug-file-directory