简介
面试官挺喜欢GDB的,好好学学吧。
入门
编译时 任意处加上 -g 可以创建GDB symbol,从而用GDB调试
g++ file.c -g -o file
显示
栈帧与变量
bt # 显示栈帧
bt full # 显示栈帧与局部变量
p symbol # 查看本地变量
显示源文件
l # 打印十行源文件,多次使用则往下走
l 20 # 打印源文件15-24行
l main # 打印main函数前后五行的源代码
查看内存
x/[n][f][u] <addr>
-
x : examine 的缩写
-
n : 要显示的内存单元的个数
-
f : 显示方式,
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式 (x/30i可以打印三十条汇编)
c 按字符格式显示变量。
f 按浮点数格式显示变量。 -
u : 地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节 -
<addr>代表的是起始内存,可以是寄存器比如$fp
如图打印了AArch64架构中的帧指针寄存器的十个8字节的内存单元
查看当前位置
where
查看内存
断点与调试
断点类型
break (b) main # 函数断点
break 5 # 行号断点
break *0x123456 # 内存地址断点
断点操作
info breakpoints # 显示当前断点
delete/disable/enable 2# 断点删除/禁用/启用
ignore 2 11 # 跳过某断点
单步调试
- next / nexti
next (n=1) 向前走一行源文件,会进入函数
nexti 向前走一行汇编,会进入函数 - step / stepi
step 向前走一行源文件,不会进入函数
stepi 向前走一行汇编,不会进入函数
展示表达式
display (i*10+1) # 断点固定展示表达式值
汇编
p $rsp
打印栈顶的地址(Arm则为p $sp
)disas
当场反汇编,展示xx行汇编代码
多线程
- 展示所有线程
info threads
- 单线程运行
set scheduler-locking on