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 |
可以通过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.