GDB +QEMU 中的硬件断点缺少 start_kernel

GDB +QEMU 中的硬件断点缺少 start_kernel

我正在尝试使用 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 错误。确保您拥有已修复错误的版本。

检查我提交的补丁如下:

  1. 单步错误:https://patchwork.kernel.org/project/qemu-devel/patch/[电子邮件受保护]/
  2. 断点错误:https://patchwork.kernel.org/project/qemu-devel/patch/[电子邮件受保护]/

相关内容