我正在尝试使用 GDB 调试在 QEMU 上运行的内核。
内核已使用以下选项进行编译:
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y
我使用以下命令在 qemu 中启动内核:
qemu-system-x86_64 -s -S -kernel arch/x86_64/boot/bzImage
在一个单独的终端中,我从同一路径启动 GDB 并按顺序发出这些命令:
gdb ./vmlinux
(gdb) target remote localhost:1234
(gdb) hbreak start_kernel
(gdb) c
我没有提供 rootfs,因为我现在对完整的工作系统不感兴趣,只对内核感兴趣。我还尝试了 hbreak/break 的组合。
内核刚刚启动并出现内核恐慌,因为无法找到 rootfs……这是预料之中的。我希望它停在 start_kernel 处,然后单步执行代码。
观察:如果我设置立即断点,它会工作并停止,但不会在 start_kernel /startup_64/main 上
qemu 是否有可能没有调用所有这些函数,或者是否以某种方式被屏蔽?
Kernel: 4.13.4
GDB: GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1
GCC: gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
system: ubuntu 14.04 LTS
注意:这个完全相同的过程适用于内核 3.2.93,但不适用于 4.13.4,所以我想需要更多配置。我无法在网上找到为内核 4.0 及更高版本启用此调试过程的资源,因此现在我将继续使用 3.2,欢迎对此进行任何和所有输入。
答案1
我遇到了同样的问题并找到了解决方案Linux 内核新手邮件列表。
你应该禁用卡斯劳尔在你的内核命令行中nokaslr
选项,或禁用内核选项“随机化内核内存部分”里面“处理器类型和功能”当您构建内核映像时。
答案2
除了“nokaslr”之外,如果您使用 tcg 加速器,qemu 中还会存在 gdbstub 错误。确保您拥有已修复错误的版本。
检查我提交的补丁如下: