1. 课程导论:kgdb 调试概述、QEMU 在调试中的角色、课程目标与前置知识

1.1 什么是 kgdb?内核调试的“黄金标准”

kgdb(Kernel GNU Debugger)是 Linux 内核官方支持的远程源代码级调试机制。它允许开发者通过串口或网络连接,使用标准 GDB 命令对运行中的内核进行断点设置、单步执行、变量查看与内存分析。与 printk 或 ftrace 等静态追踪手段不同,kgdb 提供了 交互式、可暂停、可回溯 的调试体验,是内核模块开发、驱动调试与系统崩溃分析的核心工具。

核心能力对比: kgdb 与常见内核调试手段的差异
调试手段 交互性 可暂停内核 源代码级 适用场景
printk 无 否 否 简单日志输出
ftrace / tracepoint 弱 否 部分 性能追踪、函数调用流
Kdump / crash 无 是(事后) 是 内核崩溃转储分析
kgdb 强 是(实时) 是 驱动调试、内核模块、中断上下文

1.2 QEMU 在调试中的角色:虚拟硬件与调试桥梁

QEMU 在本课程中扮演三个关键角色:

  • 虚拟硬件平台: 模拟 x86_64 / ARM / RISC-V 等目标机器,无需真实开发板即可运行和调试内核。
  • GDB 服务器: 通过 -s 或 -gdb tcp::1234 参数,QEMU 内置 GDB 远程调试 stub,直接与宿主机 GDB 通信。
  • kgdb 代理(可选): 当使用 -serial tcp::5555,server,nowait 时,QEMU 模拟的串口可作为 kgdb 的物理传输层,实现真正的“远程”调试体验。
为什么选择 QEMU? 相比真实硬件,QEMU 提供可重复的调试环境、快照/恢复功能、以及无需额外串口线的纯软件调试链路。本课程所有实验均可在单台 Linux 主机上完成。
QEMU + kgdb 远程调试架构 宿主机(Host) GDB 客户端 (gdb) target remote :1234 kgdb 前端 kgdboc / kgdbwait 传输层:TCP 串口 / UDP / 模拟串口 QEMU -serial tcp::5555,server,nowait QEMU 模拟器 -s -S -kernel vmlinux -append "kgdboc=ttyS0,115200" 目标机(Guest / Target) Linux 内核(vmlinux) kgdb_arch_init() → 注册调试异常 kgdb_breakpoint() → 触发断点 模拟串口驱动(ns16550 / pl011) kgdboc 注册为轮询式串口 QEMU 硬件模拟层 CPU / 中断控制器 / 定时器 TCP 连接 调试流程:GDB 发送 kgdb 协议包 → QEMU 串口转发 → 目标内核 kgdb 异常处理 → 返回寄存器/内存数据

1.3 课程目标:从零搭建可调试内核环境

完成本课程后,你将掌握以下核心技能:

  1. 环境构建: 编译支持 kgdb 的内核镜像,配置 QEMU 启动参数,建立宿主机与目标机的调试链路。
  2. 断点操作: 在函数入口、行号、条件表达式上设置/删除/禁用断点,理解硬件断点与软件断点的差异。
  3. 状态分析: 查看内核调用栈、局部变量、全局变量、寄存器与内存数据,结合 vmlinux 符号表精确定位。
  4. 高级技巧: 使用 kgdbwait 在启动早期暂停内核、调试中断处理程序、以及结合 kdb 进行无 GDB 环境的应急调试。
前置知识要求: 本课程假设你已具备以下基础:
• 熟悉 Linux 命令行操作(gcc、make、git)
• 了解 Linux 内核编译流程(至少成功编译过一次内核)
• 掌握 GDB 基本命令(break、continue、next、print)
• 具备基本的 C 语言与操作系统概念(进程、中断、内存管理)

1.4 实验环境概览

本课程所有实验均基于以下统一环境,确保可复现性:

组件 版本 / 配置 说明
宿主机 OS Ubuntu 22.04 / Debian 12 推荐 x86_64 架构
QEMU ≥ 7.2.0 需启用 GDB stub 支持
Linux 内核 6.x LTS(如 6.1.y) 配置 CONFIG_KGDB=y
交叉工具链 gcc-12 / gcc-13 目标架构默认与宿主机一致
GDB ≥ 12.1 支持 Python 脚本扩展
快速验证: 在终端执行 qemu-system-x86_64 --version 与 gdb --version,确认版本满足要求。后续章节将提供完整的 Docker 环境配置方案,避免依赖冲突。
课程实验流程总览 步骤 1 内核配置与编译 CONFIG_KGDB=y 步骤 2 QEMU 启动脚本 -s -S -append "kgdboc=ttyS0" 步骤 3 GDB 远程连接 target remote :1234 步骤 4 断点调试实战 break / continue / bt 每章交付物 • 章节 2-5:内核编译配置、QEMU 启动脚本、GDB 连接验证 • 章节 6-15:软件断点、硬件断点、条件断点、watchpoint 实战 • 章节 16-30:中断上下文调试、kgdbwait、kdb 模式、自动化调试脚本

1.5 为什么选择本课程?

市面上关于 kgdb 的资料多为零散的博客或过时的内核版本。本课程具有以下差异化优势:

  • 全实战驱动: 每章均包含可运行的代码示例与 QEMU 启动配置,拒绝纯理论。
  • 覆盖最新内核: 基于 Linux 6.x LTS 内核,适配现代 GDB 与 QEMU 特性。
  • 从串口到网络: 同时讲解 kgdboc(串口)与 kgdbmoc(网络)两种传输方式,适应不同场景。
  • 故障注入与恢复: 模拟内核 panic、死锁、内存越界等典型故障,训练调试思维。
课程承诺: 学完本课程后,你将能够独立搭建一套完整的 kgdb 远程调试环境,并具备调试 90% 以上常见内核模块问题的能力。