调试流程:
1、 带着调试选项编译、构建调试对象
2、 启动调试器
1) 设置断点
2) 显示栈帧
3) 显示值
4) 继续执行
准备
gcc –Wall –O2 –g
Makefile中添加 CFLAGS = -Wall –O2–g
configure脚本 ./configure CFLAGS=”-Wall–O2 –g”
启动
设置断点
break (b)
格式
break:
函数名
行号
文件名:行号
文件名:函数名
+偏移量
-偏移量
*地址
运行
run (r) 开始运行程序,到断点处停住
start (s) 开始运行程序,到main函数的第一条语句处停住
显示栈帧
backtrace (bt)
别名:where / info stack(info s)
格式:
backtrace 显示所有栈帧
backtraceN 显示N个栈帧
backtrace–N 只显示最后N个栈帧
backtracefull 显示局部变量。可与N配合使用
显示变量
print (p)
显示寄存器
l info reg 显示寄存器
l 在寄存器之前添加$,可显示各个寄存器的内容,(gdb)p$eax
显示寄存器可使用的格式
格式 | 说明 |
x | 显示为16进制 |
d | 显示为十进制 |
u | 显示为无符号十进制 |
o | 显示为八进制 |
t | 显示为二进制,t的由来是two |
a | 地址 |
c | 显示为字符ascii |
f | 浮点小数 |
s | 显示为字符串 |
i | 显示为机器语言(仅在显示内存的x命令中可用) |
例(gdb) p/c $eax
$7 = 97 ‘a’
l 用x命令可以显示内存的内容。x指 eXamining
(gdb) x $pc
0x40055e <main+46>: 0x000000b8
(gdb) x/i $pc
=> 0x40055e <main+46>: mov $0x0,%eax
一般使用x命令时,格式为x/NFU ADDR。
N:重复次数
F:前面讲到的格式(x/d/u/o/t/a/c/f/s/i)
U:单位,如下
单位 | 说明 |
b | 字节 |
h | 半字(2字节) |
w | 字(2字节) |
g | 双字(8字节) |
l 反汇编命令disassemble(disas)
格式
diss (反汇编当前整个函数)
diss 程序计数器(反汇编程序计数器所在函数的整个函数)
diss 开始地址结束地址(反汇编从开始地址到结束地址之间的部分)
单步执行
l next (n) 执行源代码中一行的命令
l step (p) 进入函数内部执行
继续运行
l continue (c) <次数>
监视点
l watch <表达式>
表达式发生变化时暂停运行
l rwatch <表达式>
表达式被访问量暂停运行
删除断点和监视点
l delete <编号>
删除<编号>指示的断点或监视点
l info b 显示断点
其他断点
l hbreak 硬件断点,适用于ROM空间等无法修改的内在区域中的程序。
l tbreak/thbreak 临时断点/临时硬件断点,与断点/硬件断点相同,都会运行到此处暂停,不同之处是临时断点/临时硬件断点会在此时被删除,即只暂停一次。
改变变量的值
set variable <变量>=<表达式>
生成内核转储文件
l generate-core-file
l 命令gcore <pid>也可以直接转储文件