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

Mah*_*ouk 5 gdb kernel breakpoints qemu watchpoint

我正在调试内核,我想知道cr3寄存器何时被更改.我知道如何在像eax和其他人这样的通用寄存器上设置观察点.

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

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

Pet*_*ell 3

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

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