title: 用gdb調(diào)試代碼
tags:
- gdb
date: 2017-08-09 15:09:22
gdb調(diào)試
$ gdb execfile
開始調(diào)試execfile感挥;
list
list
,簡寫為l
,顯示源文件;命令格式:
list | l [arg1,arg2]
arg1為起始行號,arg2為結(jié)束行號嘀粱;顯示arg1行到arg2行之間的代碼激挪;
未設(shè)置arg1和arg2 時,默認顯示10行草穆;
(gdb) l
#顯示1-10行代碼
break
break
灌灾,簡寫b
,設(shè)置斷點悲柱;命令格式:
break | b location
location可以是function(函數(shù)名) | linenum(行號) | address(偏移地址)锋喜;
(gdb) b _start
(gdb) b *_start + 4
(gdb) b 14
run、stepi豌鸡、info
run
run
嘿般,簡寫r
,運行程序涯冠;
stepi
stepi
炉奴,簡寫si
,執(zhí)行一條指令蛇更;命令格式:
stepi | si [N]
N意味著執(zhí)行N條指令(或者到程序結(jié)束處)瞻赶;
(gdb) si
# 執(zhí)行一條指令
(gdb) si 4
# 執(zhí)行四條指令
info
info
,簡寫i
派任,顯示一些調(diào)試信息砸逊;
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參數(shù)如下表:
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,打印內(nèi)存單元中的值脂男;命令格式:
x/nfu address
address表示內(nèi)存單元地址;
n是一個整數(shù)种呐,表示顯示幾個內(nèi)存單元宰翅;默認是1;
f表示格式化爽室,見上表汁讼;默認是x;
u表示內(nèi)存單元大小,見下表:
unit letter | description |
---|---|
b | Bytes |
h | HalfWords(two bytes) |
w | Words(four bytes, default) |
g | Giant words(eight bytes) |
(gdb) x/5cb &Snippet
#從Snippet所在的地址開始打印連續(xù)的5個以字節(jié)為單位的內(nèi)存單元嘿架,并以字符的形式顯示瓶珊;
(gdb) x/5cb 0x6000c8;
#從地址為0x6000c8的內(nèi)存單元開始打印耸彪;
display
display
伞芹,Automatic Display,自動顯示蝉娜,每次運行完一條指令自動打印顯示列表中的值唱较;命令格式:
display[/fmt] expr | address
display會根據(jù)設(shè)置的fmt,expr或者address自動判斷是調(diào)用x
還是print
召川。
(gdb) display/5xb &Snippet
#等價于每次執(zhí)行完一條指令后南缓,自動執(zhí)行一次x/5xb &Snippet;
(gdb) display/x $ebx
#相當(dāng)于每次執(zhí)行一條指令后荧呐,自動執(zhí)行一次p/x $ebx汉形;
quit
quit
,簡寫q
倍阐,退出gdb概疆;
shell
需要在gdb中執(zhí)行shell命令時,可以使用shell
收捣;命令格式:
shell command
TUI模式
gdb提供TUI(Text User Interface)模式届案,方便調(diào)試代碼;
進入TUI模式
利用gdb -tui execfile
命令進入gdb罢艾,可以開啟TUI模式楣颠;
進入gdb之后通過快捷鍵ctrl+x a
或者使用命令tui enable
開啟TUI模式;
layout
可以利用layout
命令調(diào)整TUI中的布局咐蚯;通過help layout
可以查看幫助童漩;命令格式:
layout next | prev | layoutname
next下一個布局,prev上一個布局春锋,layoutname見下表:
layoutname | description |
---|---|
src | 源碼布局 |
asm | 匯編布局 |
split | 源碼矫膨,匯編,cmd布局 |
regs | 寄存器布局 |
winheight
調(diào)整布局的大小期奔,命令格式:
winheight winname [+ | -] lines
winname見下表:
winname | description |
---|---|
src | 源碼窗口 |
asm | 匯編窗口 |
cmd | 命令窗口 |
regs | 寄存器窗口 |
+
表示窗口winname
增大lines
行侧馅,-
表示窗口winname
減小lines
行;
focus
利用focus
可以讓焦點關(guān)注不同的窗口呐萌;命令格式:
focus next | prev | winname
next下一個窗口馁痴,prev上一個窗口,winname見上表肺孤;
當(dāng)cmd不被focus時罗晕,在cmd中方向鍵不起作用济欢,若要使用方向鍵,此時方向鍵命令同emacs一樣(ctrl+p
向上小渊,ctrl+n
向下法褥,ctrl+f
向右,ctrl+b
向左)酬屉;
refresh
refresh
刷新窗口半等;
關(guān)閉TUI模式
ctrl+x a
既可以開啟TUI,也可以關(guān)閉TUI梆惯;
tui disable
關(guān)閉TUI模式酱鸭;