使用 gdbserver 和 qemu 进行调试,如何在控制寄存器上设置观察点,cr3

Debugging with gdbserver and qemu, how to set watchpoint on a control register, cr3

我正在调试内核,我想知道 cr3 寄存器何时更改。我知道如何在 eax 等通用寄存器上设置观察点。

问题是,由于 gdb 无法访问控制寄存器,因此在 cr3 上设置观察点不起作用。

那么,是否可以从 qemu 监视器设置观察点?如果是,如何?

抱歉,无法从 QEMU 监视器执行此操作。 (如果您查看 QEMU 源代码中的 target-i386/helper.c:cpu_x86_update_cr3() ,您会发现它不会做任何会通知任何人有关 CR3 更新的事情,它只是将新值放入内部 CPU 状态结构。)

你能为这类事情做的最好的事情是 运行 使用两个调试器(一个连接到 QEMU 的 gdbstub 与来宾对话,另一个直接调试 QEMU 本身)。然后你可以在 QEMU 中的 cpu_x86_update_cr3() 上放置一个断点,然后看看发生了什么。不过,您需要对 QEMU 的内部结构有相当多的了解才能有效地做到这一点...