913 字
5 分钟
使用GDB调试嵌入式设备

本文主要介绍在嵌入式 Linux 设备中使用 GDB 进行程序调试的方法。对于单片机开发,虽然可以使用 IDE 集成的调试功能,或通过 pyocdopenocd 配合 DAPLink 等硬件调试探针,但其核心原理与 GDB 调试是一致的。


环境准备#

在进行调试前,需确保开发环境(如 Buildroot)已安装必要的调试组件。

1. 安装组件#

通过 menuconfig 在根文件系统中启用以下工具:

  • gdb: 运行在开发板上的完整调试器。
  • gdbserver: 运行在开发板上的轻量化调试代理(推荐用于交叉调试)。

验证安装:

Terminal window
[root@luckfox root]# gdb --version
GNU gdb (GDB) 10.2
[root@luckfox root]# gdbserver --version
GNU gdbserver (GDB) 10.2

2. 编译配置#

为了生成调试符号表并确保代码执行顺序与源码一致,必须在编译时开启 -g 参数并尽量禁用优化 -O0

# 例如使用CMake进行构建时,设置参数
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g")

常用调试途径对比#

途径实现方式适用场景
GDB 命令行直接在板端通过 GDB 运行程序或分析 Core Dump快速定位崩溃点、打印堆栈、资源受限无法连接主机时
单步调试通过 gdbserver 连接主机(如 VSCode)远程调试逻辑分析、对照源码逐行排查、复杂业务流程调试

一、 GDB 命令行调试#

1. 场景一:实时捕获(Live Debug)#

针对可以稳定复现的程序崩溃(Segmentation fault)。

  • 启动调试

    Terminal window
    gdb ./your_app
  • 常用交互命令

命令说明
set args --config ./test.conf设置程序启动参数
run (r)开始运行程序
bt (backtrace)打印当前简略调用堆栈
bt full打印堆栈及每一层函数的局部变量值
thread apply all bt查看所有线程的堆栈(用于分析多线程死锁或崩溃)

2. 场景二:Core Dump 核心转储#

用于处理偶发性崩溃,通过事后“尸检”定位问题。

  • 启用生成

    Terminal window
    ulimit -c unlimited # 设置 core 文件大小不受限制
  • 设置路径(可选):

    Terminal window
    # 将 core 文件统一存放到 /tmp,并按进程名、PID 和时间命名
    echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
  • 加载分析

    Terminal window
    # 必须同时提供可执行文件和 core 文件
    gdb ./your_app core

3. 场景三:深入崩溃点#

操作命令示例功能描述
切换帧frame 2切换到堆栈中的指定层级(如切换回应用代码层)
查看源码list显示当前断点或崩溃点附近的源码
检查变量print *my_ptr打印变量值或解引用指针
检查状态info locals / info args打印当前函数的所有局部变量或输入参数
汇编调试disassemble在无源码时查看当前函数的汇编代码

二、 远程单步调试#

在嵌入式开发中,通常在板端运行 gdbserver(节省空间),在 Host 端(PC)使用带符号表的程序和源码进行可视化调试。

1. 板端操作#

启动 gdbserver 并监听调试端口(如 1234):

Terminal window
gdbserver :1234 ./my_app

2. Host 端配置 (VSCode)#

需安装 C/C++ (cpptools) 扩展。创建 .vscode/launch.json

{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Luckfox Remote Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/my_app", // 必须是带调试符号的可执行文件
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/opt/luckfox-sdk/tools/linux/toolchain/.../arm-linux-gnueabihf-gdb", // 交叉编译器的 GDB 路径
"miDebuggerServerAddress": "192.168.1.123:1234", // 板端 IP 和端口
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Sysroot for Cross-Debugging",
"text": "set sysroot ${workspaceFolder}/buildroot/output/staging", // 关键:指定交叉编译系统库路径
"ignoreFailures": false
}
]
}
]
}

配置完成后,在 VSCode 中按 F5 即可进入图形化单步调试界面。

使用GDB调试嵌入式设备
https://hyrsoft.github.io/posts/tools/使用gdb调试嵌入式设备/
作者
好软好温暖
发布于
2026-01-30
许可协议
CC BY-NC-SA 4.0