说明
以前使用过eclipse调试过内核,最近又想用gdb调试内核,还是比较习惯使用命令操作,但是在搭建调试内核的gdb和qemu过程中,遇到一个问题,想了很多办法,最后直接感觉到官方下载最新的gdb和qemu源码安装,以为调试内核设置断点不成功是因为使用apt安装的gdb和qemu比较旧,安装新的gdb和qemu后,还是断点没起作用,折腾了还几天,终于找到原因了。下面是作者的环境:
- ubuntu16.04
- GNU gdb (GDB) 8.1.50.20180125-git
- QEMU emulator version 2.11.0
- linux-4.15
但是根据最后的原因,调试最新的内核可以使用apt安装的gdb和qemu
内核配置
- 配置调试信息
与其他相关配置内核环境的教程一样,需要配置调试信息到vmlinux:
[*] Compile the kernel with debug info(选中这个) - 取消KASLR
如下截图所示:
取消选项:
[ ] Randomize the address of the kernel image (KASLR) - 说明
为什么取消这个KASLR,不了解其他人在使用gdb+qemu调试最新的内核时,是否遇到在设置的断点处,在qemu运行的系统不会暂停,直接运行到挂接文件系统,测试了很多办法,最后在
https://unix.stackexchange.com/questions/396013/hardware-breakpoint-in-gdb-qemu-missing-start-kernel
给了我提示,然后取消这个选项后,果然设置断点成功。 - 主要问题
在gdb里边设置断点后,断点不起作用,qemu里运行的系统没有在相应的断点处stop,直接运行到挂接文件系统。