Linux Kernel Debug 配置教程

本文记录了在基于 Qemu 的虚拟机中进行内核代码调试的完整流程。

1 编译安装调试版内核

内核编译的完整流程可参考Linux内核编译

在开始编译之前,需要对.config进行简单修改以关闭或打开特定的配置项。推荐使用make menuconfig命令进行配置。其余的编译流程不变。

1.1 必须打开的配置

1
2
3
4
5
Kernel hacking  --->
[*] Kernel debugging
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info
[*] Provide GDB scripts for kernel debugging

1.2 必须关闭的配置

下面的选项会导致打断点失败,一定要关闭。

1
2
Processor type and features ---->
[] Randomize the address of the kernel image (KASLR)

2 启动内核并调试

2.1 内核启动

为了启动内核以及 GDB Server,需要在 Qemu 虚拟机的启动命令中加入两个新参数-s -S

1
qemu-system-x86_64 -s -S ……

-s 选项是 -gdb 的简写,会在本地的 1234 端口启动一个 GDB 服务。
-S 代表暂停虚拟机,等待 GDB 执行 continue 指令。其余参数不变。

2.2 内核调试

2.2.1 VS Code 图形化界面调试

VS Code 调试功能配置可参考VS Code配置教程

.vscode/launch.json文件中,需要将被调试的程序指定为vmlinux,其他字段无需修改。

1
"program": "${workspaceFolder}/vmlinux",
  1. 虚拟机开机阶段不能打断点,需要等内核加载完毕才可设置断点
  2. 如需调试内核模块代码,简单起见,需要将内核模块编译到内核中(而非单独的模块)

2.2.1 GDB 命令行界面调试

先加载符号表,然后连接到 Qemu 使用的远程调试端口。

1
2
3
cd ~/linux-5.3.7
gdb vmlinux
(gdb) target remote :1234

Linux Kernel Debug 配置教程
https://zdawng.github.io/posts/c45bcc25/
作者
ZDawnG
发布于
2024年5月18日
许可协议