📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
嵌入式开发中的实战 KGDB 调试教程(附概念解析与面试问答)
关键词:KGDB、内核调试、嵌入式Linux、串口调试、GDB、驱动开发
一、什么是 KGDB?
KGDB(Kernel GNU Debugger) 是 Linux 提供的一个用于调试内核的机制,允许你通过串口或网络使用 GDB(GNU Debugger)调试正在运行的内核。
📌 一句话总结:KGDB 就是给 Linux 内核加上了 GDB,让你可以设置断点、单步执行、查看变量,像调试应用程序一样调试内核。
二、KGDB 在嵌入式场景中的价值
嵌入式设备常见的调试方式:
printk打印信息dmesg查看内核日志strace分析系统调用
然而:
- 当系统死机、卡死、异常重启时,
printk可能输出不了任何信息。 - 调试驱动初始化、中断或调度相关问题,
printk远远不够。
✅ KGDB 弥补了这一短板,适用于如下情况:
| 应用场景 | KGDB 优势 |
|---|---|
| 系统异常死机、黑屏无日志 | 可直接捕获 panic 和异常指令,定位崩溃现场 |
| 驱动开发和中断调试 | 可以断在 probe、irq handler 等函数上单步调试 |
| 调度或死锁分析 | 可查看调度器状态、锁状态、等待队列 |
三、KGDB 工作原理简介
KGDB 工作原理如下:
- 内核中编译支持 KGDB 和 KGDB_OC(串口控制台)
- 系统启动时通过串口等待 GDB 连接
- 用户端运行 GDB,通过串口与目标连接
- 一旦连接,GDB 可进行断点、调试操作
调试流程如下:
[GDB 主机] ------串口/网络------> [目标设备内核 + kgdb]
四、配置嵌入式内核支持 KGDB
4.1 配置内核选项(make menuconfig)
Kernel hacking --->
[*] Kernel debugging
[*] KGDB: kernel debugger
[*] KGDB: use kgdb over the serial console
对于串口调试还需:
Device Drivers --->
Character devices --->
[*] Support for console on serial port
编译后生成的内核应为
vmlinux(未压缩,带符号信息)
4.2 设置启动参数
在 U-Boot 启动参数中追加:
kgdboc=ttyLP1,115200 kgdbwait
说明:
kgdboc指定串口设备名(和波特率)kgdbwait表示内核启动时暂停,等待 GDB 连接
4.3 配置串口连接
- 开发板与主机通过 USB 转串口线连接(如
/dev/ttyUSB0)
五、GDB 调试流程(本地机执行)
5.1 启动 GDB 加载符号
aarch64-poky-linux-gdb ./vmlinux

5.2 连接串口(以 ttyUSB0 为例)
target remote /dev/ttyUSB0
若连接成功,内核会显示进入 KGDB 模式,GDB 会停在一个断点处。
5.3 常用调试命令
b my_driver_probe # 设置断点
c # 继续执行
s # 单步调试
info registers # 查看寄存器
bt # 查看调用栈
p my_var # 查看变量
六、驱动调试实战示例(I2C 驱动卡死)
某 I2C 驱动在 probe 时系统重启。
6.1 加断点调试定位
b my_i2c_probe
c
进入 probe 后单步执行,发现某函数
read_reg(NULL)访问了空指针。
6.2 查看变量状态
p *client
p client->addr
七、典型问题与解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 连接后无响应 | 串口波特率错误 | 确认 kgdboc=ttyX,115200 中串口号与设备一致 |
| GDB 无法连接 | 没有加 kgdbwait | 添加启动参数,或运行时启用 echo ttyLP1,115200 > kgdboc |
| 无法设置断点 | 编译未带符号信息 | 使用 vmlinux 而非 Image、zImage |
八、面试常问 KGDB 问题
Q1:KGDB 是怎么工作的?
答: KGDB 允许使用 GDB 通过串口或网络与内核通信,GDB 调用 target remote 与 kgdb 配对进行调试。
Q2:KGDB 和 printk、dynamic debug 区别?
| 工具 | 场景 | 优点 |
|---|---|---|
| printk | 日常调试 | 简单易用,但遇到死机就没输出 |
| dynamic debug | 日志动态控制 | 灵活,但仍不能单步或观察变量 |
| KGDB | 崩溃定位 / 单步调试 | 功能最强,适合定位复杂问题 |
Q3:你怎么调试某个内核模块死机问题?
答: 开启 KGDB,设置断点在模块初始化函数,通过 GDB 单步执行,查看是否指针为空、内存未映射等。
九、总结与建议
KGDB 是嵌入式开发中的强大工具,尤其适合内核层问题的定位。相比 printk,它可以让你真正“走进内核”,了解出错的本质原因。
✅ 实战建议:
- 平时熟悉 GDB 使用
- 常用断点 + 单步调试排查驱动问题
- 与
perf/ftrace配合定位卡顿、性能瓶颈
如你正在做驱动调试、系统死机分析,KGDB 是必须掌握的技能。
📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
6295

被折叠的 条评论
为什么被折叠?



