控制寄存器和gdb

时间:2014-06-11 18:04:17

标签: debugging linux-kernel gdb qemu

我很好奇为什么gdb不显示x86的控制寄存器。我一直在使用带有qemu的gdb来调试一些内核。我使用info寄存器和info all-registers获取寄存器值。

然而,我不能得到cr3和cr2。(一般CRs)。有没有办法得到它们。如果没有,那么他们为什么不提供。

-Thanks

3 个答案:

答案 0 :(得分:7)

如果你正在使用qemu,你可以通过在启动qemu的shell中发出这两个命令来获取所有寄存器状态(甚至是控制状态):

  • ctrl-a c(切换到qemu命令界面)
  • info寄存器(获取寄存器状态)

答案 1 :(得分:2)

更新:

您可以从gdb检查控制寄存器的值。问题是你的程序必须以实模式运行(大多数引导加载程序都有一个在实模式下运行的部分)。

来自@Mahouk的更新:

由于我和@Majouk在这个帖子上的票数相同,所以你一定要查看他的答案并尝试从qemu获取寄存器值。

原始回答:

我有同样的问题,似乎gdb没有那个选项。 我不确定为什么他们没有提供,但我可以建议你另类。

你可以从Qemu切换到Bochs。是的,它可能有点古怪或较慢但是 它有一个非常好的内部调试器。用于查看控制寄存器的命令 bochs是creg

有关详细信息,请参阅Boch的文档here

祝你好运:)

答案 2 :(得分:0)

QEMU 4.0.0中的

info registers确实向我显示了CR寄存器,这可能是由于QEMU更新造成的,因为QEMU发送了XML,该XML描述了它将显示给GDB的寄存器。我看到了:

cr0            0x80050033       [ PG AM WP NE ET MP PE ]
cr2            0x6a8d18 6982936
cr3            0xe0bc000        [ PDBR=7 PCID=0 ]
cr4            0x7406f0 [ PKE SMAP SMEP OSXSAVE OSXMMEXCPT OSFXSR PGE MCE PAE PSE ]
cr8            0x0      0

或者我也可以通过以下方式获得单个的东西:

i r cr0
i r cr2
i r cr3

经过this exact setup的测试。