基本命令
#gdb test test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。
start : 指令会执行程序至main() 主函数的起始位置,即在main() 函数的第一行语句处停止执行(该行代码尚未执行)
continue : 从断点位置继续运行
r(un) : 指令会一直执行程序,直到执行结束。 如果程序中手动设置有断点,则run 指令会执行程序至第一个断点处。在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和shell通配符(*、?、[、])在内。
n(ext) : 单步运行,逐过程调试C 代码Style
s(tep) : 单步运行,逐语句调试,C Style
n(ext)i : 单步运行,逐过程调试汇编代码
s(tep)i : 单步运行,逐语句调试汇编代码,si/s 都可以
finish : 如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish
until : 结束当前循环
whatis : 显示变量或函数类型
quit : 退出gdb
file tools/system : 添加sourceMap文件tools/system
directory /Users/Linux/Linux-0.11-on-mac: 指定源码路径"/Users/Linux/Linux-0.11-on-mac "
source a 应用gdb命令脚本 a,可以在脚本中添加一系列断点,避免每次调试都需要设置这些断点。更多参考
断点
info b 查看断点,information break的缩写
break n 在n行处设置断点
tbreak n/ tbreak func 设置临时断点,到达n行或函数func 后被自动删除
break main.c:10 在main.c文件第10行设置断点
break 0x3400a 在内存0x3400a处设置断点
break 10 if i==3 设置条件断点,在循环中使用非常方便
clear 10 清除第10行的断点,清除时GDB会给出提示
delete 3 对第10行 清除断点和自动显示的表达式的命令,清除时GDB不会给出任何提示
disable/enable 3 让所设断点暂时 关闭/开启,如果要让多个编号处的断点失效/使能,可将编号之间用空格隔开
awatch/watch i 设置一个观察点,当变量i 被读出或写入时程序被暂停
rwatch i 设置一个观察点,当变量i 被读出时,程序被暂停
查看源代码
list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
list 12:将显示当前文件以“12行”为中心的前后10行代码,
list main:将显示“main”所在函数的源代码,
查看运行信息
info program :查看程序的是否在运行,进程号,被暂停的原因。
p i 显示变量值i,在程序暂停时,键入"p 变量名"(print)即可,GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名;
display 查看变量或表达式的值,例如: display /x i,以16进制显示变量i的值。它与print的区别是,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。 参考
watch i 观察变量,在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;
i register 打印寄存器的值,输出不包括浮点寄存器和向量寄存器的内容
i all-registers 输出所有寄存器的内容
i registers eax”或者“p $eax 打印eax寄存器的值, 参考
where/bt :当前运行的堆栈列表
bt /backtrace/info stack :显示当前调用堆栈
bt full :查看完整的调用堆栈信息,包括每个栈帧中所有变量和参数的信息。
up/down :改变堆栈显示的深度
set args :指定运行时的参数
set args [arguments] :传递命令行参数
show args :查看设置好的参数
gdb查看内存数据
格式: x /nfu 例如: x /20xh 0x7fffffffe080
说明:
x 是 examine 的缩写,意思是检查。
n表示要显示的内存单元的个数,比如:20
f表示显示方式, 可取如下值:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u表示一个地址单元的长度:
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
layout
(gdb) layout src 显示源代码窗口
(gdb) layout regs 显示寄存器窗口
(gdb) layout asm 显示汇编代码窗口
(gdb) layout split 显示源代码和汇编代码
info win 显示窗口的大小
layout next 切换到下一个布局模式
layout prev 切换到上一个布局模式
focus cmd/src/asm/regs/next/prev 切换当前窗口
refresh 刷新所有窗口
update 更新源代码窗口和当前执行点