title: 用gdb調試代碼
tags:
- gdb
date: 2017-08-09 15:09:22
gdb調試
$ gdb execfile
開始調試execfile;
list
list
,簡寫為l
,顯示源文件;命令格式:
list | l [arg1,arg2]
arg1為起始行號,arg2為結束行號;顯示arg1行到arg2行之間的代碼;
未設置arg1和arg2 時,默認顯示10行;
(gdb) l
#顯示1-10行代碼
break
break
,簡寫b
,設置斷點;命令格式:
break | b location
location可以是function(函數名) | linenum(行號) | address(偏移地址);
(gdb) b _start
(gdb) b *_start + 4
(gdb) b 14
run、stepi、info
run
run
,簡寫r
,運行程序;
stepi
stepi
,簡寫si
,執行一條指令;命令格式:
stepi | si [N]
N意味著執行N條指令(或者到程序結束處);
(gdb) si
# 執行一條指令
(gdb) si 4
# 執行四條指令
info
info
,簡寫i
,顯示一些調試信息;
info registers -- List of integer registers and their contents
#可以簡寫為 i r
info breakpoints -- Status of specified breakpoints (all user-settable breakpoints if no argument)
#簡寫 i b
print
,簡寫p
,Examining Data,打印寄存器中的值或打印變量中的值;命令格式:
print | p [/fmt] $registers | variable
registers表示寄存器,如eax,ebx,ecx,edx,esi, edi, esp, ebp, eflags等;
fmt參數如下表:
format letter | description |
---|---|
o | octal |
x | hex |
d | decimal |
u | unsigned decimal |
t | binary |
f | float |
a | address |
i | instruction |
c | char |
s | string |
z | hex,zero padded on the left |
(gdb) p $eax
#打印寄存器eax中的值
(gdb) p Snippet
#打印Snippet中的值
examine
x
,全稱:examine;Examining Memory,打印內存單元中的值;命令格式:
x/nfu address
address表示內存單元地址;
n是一個整數,表示顯示幾個內存單元;默認是1;
f表示格式化,見上表;默認是x;
u表示內存單元大小,見下表:
unit letter | description |
---|---|
b | Bytes |
h | HalfWords(two bytes) |
w | Words(four bytes, default) |
g | Giant words(eight bytes) |
(gdb) x/5cb &Snippet
#從Snippet所在的地址開始打印連續的5個以字節為單位的內存單元,并以字符的形式顯示;
(gdb) x/5cb 0x6000c8;
#從地址為0x6000c8的內存單元開始打?。?
display
display
,Automatic Display,自動顯示,每次運行完一條指令自動打印顯示列表中的值;命令格式:
display[/fmt] expr | address
display會根據設置的fmt,expr或者address自動判斷是調用x
還是print
。
(gdb) display/5xb &Snippet
#等價于每次執行完一條指令后,自動執行一次x/5xb &Snippet;
(gdb) display/x $ebx
#相當于每次執行一條指令后,自動執行一次p/x $ebx;
quit
quit
,簡寫q
,退出gdb;
shell
需要在gdb中執行shell命令時,可以使用shell
;命令格式:
shell command
TUI模式
gdb提供TUI(Text User Interface)模式,方便調試代碼;
進入TUI模式
利用gdb -tui execfile
命令進入gdb,可以開啟TUI模式;
進入gdb之后通過快捷鍵ctrl+x a
或者使用命令tui enable
開啟TUI模式;
layout
可以利用layout
命令調整TUI中的布局;通過help layout
可以查看幫助;命令格式:
layout next | prev | layoutname
next下一個布局,prev上一個布局,layoutname見下表:
layoutname | description |
---|---|
src | 源碼布局 |
asm | 匯編布局 |
split | 源碼,匯編,cmd布局 |
regs | 寄存器布局 |
winheight
調整布局的大小,命令格式:
winheight winname [+ | -] lines
winname見下表:
winname | description |
---|---|
src | 源碼窗口 |
asm | 匯編窗口 |
cmd | 命令窗口 |
regs | 寄存器窗口 |
+
表示窗口winname
增大lines
行,-
表示窗口winname
減小lines
行;
focus
利用focus
可以讓焦點關注不同的窗口;命令格式:
focus next | prev | winname
next下一個窗口,prev上一個窗口,winname見上表;
當cmd不被focus時,在cmd中方向鍵不起作用,若要使用方向鍵,此時方向鍵命令同emacs一樣(ctrl+p
向上,ctrl+n
向下,ctrl+f
向右,ctrl+b
向左);
refresh
refresh
刷新窗口;
關閉TUI模式
ctrl+x a
既可以開啟TUI,也可以關閉TUI;
tui disable
關閉TUI模式;