当前位置: 首页 > backend >正文

QtCreator 调试 Linux 内核详细步骤指南


目录

  1. 准备概览
  2. 主机与目标机环境配置
  3. 获取**“有符号”**内核映像 vmlinux
  4. Qt Creator 调试环境搭建
  5. 建立内核/驱动调试专用工程
  6. KGDB 会话的两种接入方式
  7. 调试流程(以字符设备驱动为例)
  8. 常见问题与排查
  9. 速查表

1. 准备概览

角色系统作用
开发主机Windows 10/11 + WSL2(Ubuntu 推荐)或原生 Linux运行 Qt Creator;用 本地 GDB 控制远端内核
目标机x86‑64(或 ARM)Linux运行欲调试的内核 / 模块;通过 KGDB 暴露调试接口

若开发主机直接使用 Linux,可跳过所有 WSL2 相关说明;步骤完全一致。


2. 主机与目标机环境配置

2.1 开发主机

  1. 安装 Qt Creator ≥ 10.0(仅选 Qt Creator 组件即可)。
  2. 安装最新版 GDB
    • Windows:建议用 MSYS2 (pacman -S gdb) 或 WSL2 内的 gdb-multiarch
    • Linux:。
  3. 保证 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. 建立内核 / 驱动调试工程

  1. File ▶ New ▶ Import Existing Project
  2. 导入 内核源码目录 或单独驱动目录。
  3. 工程视图左上角选中 Kit Kernel‑Remote‑Debug
  4. 若有 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 开始调试

  1. F5 连接成功后,先下断点:
    • my_open, my_read
  2. 在目标机执行:cat /dev/mydriver
  3. 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-sourceset substitute-path /build/linux /home/...

9. 速查表

快捷键(默认)作用
F5继续 / 连接
F9切换断点
F10不进入函数
F11单步进入
Shift+F11跳出
Ctrl+Alt+R重启调试
Ctrl+M书签

最后的小贴士

  1. 保存调试布局
    Window ▶ Save Layout … 取名 “KernelDebug”,下次一键还原。
  2. 脚本自动化
    把上面的 GDB 启动指令整理成 .gdbinit,Qt Creator 会自动加载。
  3. 提前在 GRUB 中加入 kgdbwait kgdboc=udp::<dev_pc_ip>:5555,可追踪 早期启动

借助 Qt Creator 的可视化断点、局部变量 / 寄存器 / 内存视图,配合 KGDB 低侵入式连接方式,就能拥有接近用户态 IDE 的内核调试体验。祝调试顺利!

http://www.xdnf.cn/news/1291.html

相关文章:

  • 多轮Function Calling的最佳实践
  • 解决找不到字体的问题
  • org.springframework.beans.factory.config.YamlPropertiesFactoryBean 类详解
  • Java函数生成实际应用案例:数据处理流水线
  • 代理设计模式:从底层原理到源代码 详解
  • RT-Thread学习笔记(三)
  • 从零开始学java--二叉树和哈希表
  • 工作中sql总结
  • 无需复杂操作即可锁定键鼠的工具
  • [大模型]什么是function calling?
  • Linux操作系统--进程程序替换and做一个简单的shell
  • 3.6/Q1,Charls数据库经典文章解读
  • 【第九章 Python学习之函数Ⅱ】
  • 监控页面卡顿PerformanceObserver
  • idea快捷键 Project tool window
  • MySQL 性能监控工具的多维度对比分析
  • 出现了锁等待或死锁现象怎么办?乐观锁?分布式锁了解一下?
  • C语言教程(十三):C 语言中 enum(枚举)的详细介绍
  • C++ 学习指南
  • 一款强大的实时协作Markdown工具 | CodiMD 9.6K ⭐
  • 携程-酒旅-数据研发面经【附答案】
  • 【Spring】单例作用域下多次访问同一个接口
  • Discuz!+DeepSeek:传统论坛的智能化蜕变之路
  • 【C++】新手入门指南(下)
  • 《Linux TCP通信深度解析:实现高可靠工业数据传输客户端》
  • 使用Python设置excel单元格的字体(font值)
  • 笔记本电脑研发笔记:BIOS,Driver,Preloader详记
  • Win10一体机(MES电脑设置上电自动开机)
  • 《Android系统应用部署暗礁:OAT文件缺失引发的连锁崩溃与防御体系构建》
  • Mediatek Android13 设置Launcher