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
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
27
28
29
30
31
32
33
34
35
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "/home/lrq/linux/nfs/qtrootfs/home/lower_app",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"miDebuggerPath": "arm-linux-gnueabihf-gdb",
"miDebuggerServerAddress": "192.168.137.50:2000"
}

]
}

4.编译时附带调试信息

要想用gdb来debug,在编译时附带调试信息是前提!如果我们用的是gcc直接编译的话,那么在编译参数里加上-g就行了,但是如果用的是CMake或者QMake来辅助编译,则通过以下的方式进行添加:

1.CMake

1
set(CMAKE_BUILD_TYPE Debug)

2.QMake

1
QMAKE_CFLAGS   +=  -g -O0

可以通过file命令来验证编译出来的可执行文件是否带了调试信息

1
2
3
lrq@lrq-virtual-machine:~/Desktop/VehicleSystem/build/gui-Release$ file GUI 

GUI: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.31, BuildID[sha1]=458c19ff5439f6978a6e7548de3767312bd450c8, with debug_info, not stripped