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

Aru*_*mar 4 kernel gdb qemu

我正在尝试使用 GDB 调试在 QEMU 上运行的内核。

内核已使用以下选项编译:

CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y
Run Code Online (Sandbox Code Playgroud)

我使用以下命令在 qemu 中启动内核:

qemu-system-x86_64 -s -S -kernel arch/x86_64/boot/bzImage
Run Code Online (Sandbox Code Playgroud)

在一个单独的终端中,我从相同的路径启动 GDB 并按顺序发出这些命令:

 gdb ./vmlinux
(gdb) target remote localhost:1234
(gdb) hbreak start_kernel
(gdb) c
Run Code Online (Sandbox Code Playgroud)

我没有提供 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
Run Code Online (Sandbox Code Playgroud)

注意:这个完全相同的过程适用于内核 3.2.93,但不适用于 4.13.4,所以我想需要更多的配置。我无法在网上找到为内核 4.0 及更高版本启用此调试程序的资源,因此到目前为止我正在继续使用 3.2,欢迎任何和所有输入。

小智 5

我遇到了同样的问题,并从linux 内核新手邮件列表中找到了解决方案。

您应该禁用KASLR在内核中的命令行与nokaslr选项,或禁用内核选项“随机化的内核内存部分”“处理器类型和功能”,当你建立你的内核映像。