gdb
gdb
gdb是gcc工具链中的调试器,本身是个命令行的可执行程序,以往我们用vscode、Qt Creator调试程序的时候,底层用的都是gdb工具,不过这些IDE把他的数据给可视化了
1.gdb中常见指令
启动与连接
| 命令 | 说明 |
|---|---|
gdb <executable> |
启动GDB并加载可执行文件 |
gdb -p <pid> |
附加到正在运行的进程 |
target remote :<port> |
连接远程gdbserver(常用于嵌入式调试) |
target remote /dev/ttyUSB0 |
通过串口连接目标板(如ARM开发板) |
断点与观察点
| 命令 | 说明 |
|---|---|
break <function> |
在函数入口设断点(如 break main) |
break *<address> |
在内存地址设断点(如 break *0x8000) |
break <file:line> |
在指定文件的某一行设断点(如 break driver.c:42) |
watch <variable> |
监视变量变化(硬件观察点需目标支持) |
info breakpoints |
查看所有断点 |
delete <n> |
删除断点(n 为断点编号) |
程序执行控制
| 命令 | 说明 |
|---|---|
run <args> |
启动程序(可带命令行参数) |
continue (或 c) |
继续执行直到下一个断点 |
next (或 n) |
单步执行(不进入函数) |
step (或 s) |
单步执行(进入函数) |
finish |
执行完当前函数并暂停 |
until <line> |
执行到指定行(避免循环单步) |
查看代码与数据
| 命令 | 说明 |
|---|---|
list (或 l) |
显示当前代码上下文 |
disassemble |
反汇编当前函数(用于调试汇编代码) |
print <var> (或 p) |
打印变量值(如 print *ptr) |
x/<n><format> <addr> |
检查内存(如 x/10x 0x8000 查看16进制格式) |
info registers |
查看寄存器值(调试内核/驱动时常用) |
bt (或 backtrace) |
查看调用栈(分析崩溃时必用) |
其他实用命令
| 命令 | 说明 |
|---|---|
shell <cmd> |
执行Shell命令(如 shell ls) |
define |
自定义命令宏(简化重复操作) |
save breakpoints <file> |
保存断点配置到文件 |
quit (或 q) |
退出GDB |
2.vscode中如何使用gdb
2.1使用了Cmake
使用了CMake并正确配置了的话,就可以在vscode中一键debug了
2.2通过launch文件
在.vscode中创建launch.json文件,并正确配置后,按F5即可进行调试
3.如何远程调试
在我们进行嵌入式应用开发时,没办法直接在板子上直接运行gdb,需要通过分布式的方式来调试,具体地:
板子上运行gdbserver进程,并指定宿主机的ip和端口
- 比如:
gdbserver 192.168.137.100:2000 ./lower_app
- 比如:
交叉编译宿主机运行交叉编译工具链中的gdb进程,并指定板子的ip和端口(在
launch.json文件中)
例如:
1 | { |
4.编译时附带调试信息
要想用gdb来debug,在编译时附带调试信息是前提!如果我们用的是gcc直接编译的话,那么在编译参数里加上-g就行了,但是如果用的是CMake或者QMake来辅助编译,则通过以下的方式进行添加:
1.CMake
1 | set(CMAKE_BUILD_TYPE Debug) |
2.QMake
1 | QMAKE_CFLAGS += -g -O0 |
优化等级概览
| 等级 | 说明 | 特点 | 适用场景 |
|---|---|---|---|
| -O0 | 不优化 | 最快编译速度,最佳调试体验 | 开发调试阶段 |
| -O1 | 基本优化 | 减少代码大小,提高执行速度 | 平衡编译速度和性能 |
| -O2 | 中等优化 | 更多优化,不增加代码大小 | 发布版本(最常用) |
| -O3 | 激进优化 | 最大执行速度,可能增加代码大小 | 高性能计算、科学计算 |
| -Os | 大小优化 | 优化代码大小 | 嵌入式设备、内存受限环境 |
| -Og | 调试优化 | 优化但保持良好调试性 | 带有调试的优化构建 |
| -Ofast | 激进+不严格 | 包含 -O3 + 不严格标准 | 对性能要求极高的科学计算 |
可以通过file命令来验证编译出来的可执行文件是否带了调试信息
1 | lrq@lrq-virtual-machine:~/Desktop/VehicleSystem/build/gui-Release$ file GUI |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.



