GDB基础用法

1.基础配置

1.1 源码调试

安装cgdb图形化外壳,支持源码级断点

1
sudo apt-get install cgdb

修改cgdb配置文件

CGDB Manual 0.8.0

1
2
3
4
5
vim ~/.cgdb/cgdbrc

file <cgdbrc>:
# 设置源码指针高亮
set arrowstyle = highlight

演示如下:cgdb upx.out

cgdb调试源码

1.2 汇编调试

修改gdb配置文件

显示汇编代码窗口 | 100个gdb小技巧 (gitbooks.io)

Debugging with GDB: TUI (deansys.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
vim ~/.gdbinit

# 初始化执行的命令
file <.gdbinit>
# intel汇编
set disassembly-flavor intel

# 常用配置命令
# 单步显示汇编
set disassemble-next-line on
# 显示寄存器窗口
layout regs
# 显示汇编窗口
layout asm
# 显示源码窗口
layout source
# 聚焦窗口
focus cmd
focus asm
focus src
# 更新源代码窗口到当前运行点
update
# 增加指定窗口的高度
winheight winname +count
# 减小指定窗口的高度
winheight winname -count

演示如下:gdb -tui upx.out

gdb调试汇编

2.调试命令

Linux基础 — Linux Tools Quick Tutorial (linuxtools-rst.readthedocs.io)

2.1 启动

1
2
3
4
5
6
7
gdb upx.out
# 设置参数
set args test.out
# 运行到main
start
# 结束调试
quit

2.2 执行

1
2
3
4
5
6
7
8
9
10
11
run / continue 			放行

n 源码级单步步过
ni 汇编级单步步过
s 源码级单步步入
si 汇编级单步步入

finish 执行完当前函数

until 运行到循环结束
until + 行号 运行到某行

2.3 断点

1
2
3
4
5
6
7
8
9
10
11
12
13
b <xxx.cpp>:n			在指定文件指定位置下断点
b *0x401000 指定地址下断点
b xxx if xxx 条件断点

rwatch *(int*)0x401000 内存读断点
awatch *(int*)0x401000 内存读写断点

info break 查看断点列表

clear address 删除指定地址处断点
delete n 删除指定编号断点
disable n 禁用指定编号断点
enable n 启用指定编号断点

2.4 内存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
x/<n/f/u> <addr>					读内存

n表示单元个数
f表示显示的格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u表示每个单元大小:
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
<addr>表示地址
print <var> 输出某个变量的值
watch <var> 监视某个变量的值

set *((int*)<memaddr>) = <value> 写内存
set var <var> = <value> 修改变量值

2.5 寄存器

1
2
info $<reg>							查看寄存器值
set $<reg> = <value> 修改寄存器值

2.6 其他

1
2
3
backtrace							调用堆栈
info pragram 查看进程信息
set print pretty on 格式化输出结构体

GDB基础用法
http://helloymf.github.io/2022/10/19/gdb-ji-chu-yong-fa/
作者
JNZ
许可协议