使用GDB和VSCode调试内核
背景
上一篇,已经搭建好QEMU的内核调试环境:基于QEMU的内核调试环境搭建 | DD'Notes
这篇主要在前面的基础上尝试用gdb来调试内核,躺了不少坑。
安装GDB
这里安装支持多种硬件体系架构的GDB版本,也可直接使用系统自带的默认gdb。如架构不同,需使用交叉编译工具链中的gdb,后面有时间会更新不同架构下的调试。
sudo apt-get install -y gdb-multiarch # 支持多种硬件体系架构的GDB版本
准备调试内核
在以前的基础上需修改一些内核配置才能调试:
- 打开
CONFIG_GDB_SCRIPTS
:在内核主目录下生成gdb脚本文件vmlinux-gdb.py
,该脚本实现了一些便于内核调试的命令,它们都以lx-开头,这个暂时先没用,后面再研究看看 - 打开
CONFIG_DEBUG_INFO
:该选项用于在内核编译时开启-g标志,保证编译的内核带有调试信息,这个很重要! - 关闭
CONFIG_DEBUG_INFO_REDUCED
- 关闭
CONFIG_RANDOMIZE_BASE
:该选项用于关闭KASLR
,或者可以在内核启动参数中添加nokaslr
,这个会导致地址随机化,从而无法调试,这个很重要!
运行qemu
这里只调试内核,就没有带根文件系统,也可以带上,这个看自己。
$ qemu-system-x86_64 -s -S \
-kernel ./bzImage \
-hda /dev/zero \
-append "root=/dev/zero console=ttyS0" \
-nographic
说明:
-s
选项是-gdb
的简写,会在本地的1234端口启动一个 GDB 服务-S
代表暂停虚拟机,等待 GDB 执行continue
指令
GDB命令行调试测试
。。。。。。