QtCreator 调试 Linux 内核详细步骤指南
目录
- 准备概览
- 主机与目标机环境配置
- 获取**“有符号”**内核映像 vmlinux
- Qt Creator 调试环境搭建
- 建立内核/驱动调试专用工程
- KGDB 会话的两种接入方式
- 调试流程(以字符设备驱动为例)
- 常见问题与排查
- 速查表
1. 准备概览
角色 | 系统 | 作用 |
---|---|---|
开发主机 | Windows 10/11 + WSL2(Ubuntu 推荐)或原生 Linux | 运行 Qt Creator;用 本地 GDB 控制远端内核 |
目标机 | x86‑64(或 ARM)Linux | 运行欲调试的内核 / 模块;通过 KGDB 暴露调试接口 |
若开发主机直接使用 Linux,可跳过所有 WSL2 相关说明;步骤完全一致。
2. 主机与目标机环境配置
2.1 开发主机
- 安装 Qt Creator ≥ 10.0(仅选 Qt Creator 组件即可)。
- 安装最新版 GDB:
- Windows:建议用 MSYS2 (
pacman -S gdb
) 或 WSL2 内的gdb-multiarch
。 - Linux:。
- Windows:建议用 MSYS2 (
- 保证 OpenSSH 客户端 可用:
ssh -V
有输出即 OK。
2.2 目标机
sudo apt update
sudo apt install openssh-server gdbserver build-essential linux-tools-common
sudo systemctl enable --now ssh
2.3 核心 KGDB 选项
确认内核编译时启用:
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y # 或者 KGDB_NET_CONSOLE
CONFIG_KGDB_KDB=y
CONFIG_DEBUG_INFO=y # 未开启则没有符号,调试基本失效
发行版自带内核一般不开 KGDB_*
,最保险做法是自己编译内核(下面第 3 节讲述)。若一定用发行版内核,请检查 /boot/config-*
,缺项就只能重编。
3. 获取「有符号」的 vmlinux
存在三种途径:
场景 | 操作 |
---|---|
Ubuntu / Debian 官方内核 | 安装 ddebs 仓库 & linux-image-$(uname -r)-dbgsym ,/usr/lib/debug/boot/vmlinux-$(uname -r) 即目标文件 |
其他发行版 | 查找对应调试符号包(debuginfo / kdump );路径同上 |
自编译 | make menuconfig 打开上面四个选项 ➜ make -j$(nproc) ,直接使用 vmlinux (位于源码顶层) |
vmlinux 必须是 未压缩、带 DWARF 调试段 的 ELF,可用
file vmlinux
验证。
4. Qt Creator 调试环境搭建
4.1 启用插件
Help ▶ About Plugins
✔ BareMetal
✔ C++ Editor
✔ Debugger
✔ GenericProject
✔ RemoteLinux
4.2 添加目标设备
Tools ▶ 外部 ▶ 配置 ▶ Devices ▶ Add ▶ Generic Linux Device
- Host name:目标机 IP
- User / Auth:SSH 用户与密钥
- Test Connection:应通过
4.3 配置本地 GDB
Qt Creator 默认会检测 gdb
; 若跨架构(例如目标是 arm64),一定用 gdb-multiarch
:
Tools ▶ Options ▶ Kits ▶ Debuggers ▶ Add
Name: GDB‑Kernel
Path: C:\msys64\usr\bin\gdb.exe 或 /usr/bin/gdb-multiarch
Engine: GDB
4.4 新建 Kit
Tools ▶ Options ▶ Kits ▶ Add
Name: Kernel‑Remote‑Debug
Device type: Generic Linux
Device: 上一步创建的设备
Sysroot: 留空
Debugger: GDB‑Kernel
Compiler / Qt version: 任意 (仅供代码补全)
5. 建立内核 / 驱动调试工程
File ▶ New ▶ Import Existing Project
- 导入 内核源码目录 或单独驱动目录。
- 工程视图左上角选中 Kit
Kernel‑Remote‑Debug
。 - 若有
compile_commands.json
(推荐用bear make
生成),在
Projects ▶ Code Model ▶ Compilation Database
指向该文件,可获得完美补全。
6. KGDB 会话的两种接入方式
6.1 串口
目标机:
# 假设调试串口为 ttyS0,115200
echo ttyS0,115200 | sudo tee /sys/module/kgdboc/parameters/kgdboc
echo g | sudo tee /proc/sysrq-trigger # 立即停在 KGDB 等待连接
开发主机:需要 USB‑TTL 转接线或实体 COM;Qt Creator 的 target remote
写 /dev/ttyS*
即可。
6.2 网络 (UDP)
内核 5.12+ 官方支持 KGDB over Ethernet,配置更简单:
echo udp://<dev_pc_ip>:5555 | sudo tee /sys/module/kgdboc/parameters/kgdboc
echo g | sudo tee /proc/sysrq-trigger
开发主机的 target remote
设置为 udp:<target_ip>:5555
。
若 Qt Creator ≤ 10 不认识 udp:
前缀,在 “Additional Startup Commands” 手动添加即可。
7. 调试流程示例(字符设备驱动)
假设驱动名
mydriver.ko
,在目标机启动成功加载。
7.1 获取模块加载地址
addr=$(cat /sys/module/mydriver/sections/.text)
echo $addr # 例如 0xffffffffc0200000
7.2 创建 “自定义可执行” 调试条目
Projects ▶ Run ▶ Add ▶ Custom Executable
≥ 9.0(含 Qt Creator 10、11) | 左边栏 Projects → 选 Kit → Build & Run → Run → 顶部 Add ➜ Add Executable… ➜ 选项列表里有 Custom Executable |
字段 | 填写 |
---|---|
Executable | /usr/lib/debug/boot/vmlinux-$(uname -r) |
Arguments / Working Dir | 为空 |
Debugger > Additional Startup Commands | 见下 |
# 1. 延长超时
set remotetimeout 60
# 2. 连接 KGDB
target remote udp:<target_ip>:5555 # 串口则换 /dev/ttyUSB0
# 3. 加载内核符号
file /usr/lib/debug/boot/vmlinux-$(uname -r)
# 4. 加载模块符号
add-symbol-file /home/user/mydriver.ko 0xffffffffc0200000
# 5. 提示优化
set pagination off
set confirm off
7.3 开始调试
- F5 连接成功后,先下断点:
my_open
,my_read
…
- 在目标机执行:
cat /dev/mydriver
- Qt Creator 命中断点,可用:
- F10/F11 单步
- “Locals & Expressions” 观察结构体
- “Debugger Console” 输入
p *(struct file *)filp
等自定义命令
8. 常见问题与排查
症状 | 解决 |
---|---|
vmlinux 无法加载符号 | ①确认 CONFIG_DEBUG_INFO=y ;②确保拿到 未 strip 版本;③file vmlinux 显示 not stripped |
Qt Creator 卡死 / 无响应 | 在 Debugger Console 输入 set remotetimeout 120 ;必要时 Ctrl +C 两次中断,重新连接 |
断点不起作用 | 宿主机/目标机 gcc 版本不匹配可能导致行号漂移;可在汇编视图 (Window ▶ Views ▶ Disassembler ) 手动下断 |
找不到源码 | directory /path/to/linux-source 或 set substitute-path /build/linux /home/... |
9. 速查表
快捷键(默认) | 作用 |
---|---|
F5 | 继续 / 连接 |
F9 | 切换断点 |
F10 | 不进入函数 |
F11 | 单步进入 |
Shift+F11 | 跳出 |
Ctrl+Alt+R | 重启调试 |
Ctrl+M | 书签 |
最后的小贴士
- 保存调试布局
Window ▶ Save Layout …
取名 “KernelDebug”,下次一键还原。 - 脚本自动化
把上面的 GDB 启动指令整理成.gdbinit
,Qt Creator 会自动加载。 - 提前在 GRUB 中加入
kgdbwait kgdboc=udp::<dev_pc_ip>:5555
,可追踪 早期启动。
借助 Qt Creator 的可视化断点、局部变量 / 寄存器 / 内存视图,配合 KGDB 低侵入式连接方式,就能拥有接近用户态 IDE 的内核调试体验。祝调试顺利!