为什么在内核模式下调试很困难?

时间:2012-01-05 17:48:35

标签: operating-system computer-architecture kernel-mode

我理解内核和用户模式的目的,以及如何从前者转换到后者。然而,许多消息来源表示,在内核模式下发生崩溃很难调试,而且应该通过telnet连接远程完成(例如here is an example)。

为什么调试这么难? 为什么不能将(内核)调试器附加到其中一个内核线程并以通常的方式使用它?

2 个答案:

答案 0 :(得分:4)

内核模式崩溃可能会破坏内存中任何的数据结构,甚至是调试器本身。制作防弹很难。

在正常调试中,您有两个完全隔离的进程 - 调试器和您正在调试的东西。他们是“同龄人”,创造了平等。正在调试的进程不能触及调试器,无论它做什么(并且可能不知道它甚至存在)。另一方面,调试器可以以固定,可预测的方式与正在调试的进程交互,这些方式始终适用于所有常规用户进程。

一个例子:如果是本地调试,你会如何调试键盘接口,如果是通过串口,你会调试RS232代码? NIC驱动程序或网络堆栈是否通过网络?在其中一个中设置断点是不可恢复的,因为您将无法访问控制调试器的设备。最糟糕的情况是,您将如何调试内核调试器?使用GDB,你至少可以理论上将GDB实例附加到另一个GDB实例而不会有太多麻烦。在内核空间中,这是不可能的,因为上面没有层可以调解事物。

答案 1 :(得分:0)

您无法以交互方式(或本地方式)调试内核,因为即使在显示器上显示图片(通过与相应的显示驱动程序通信),内核本身也是负责的,而不仅仅是这样。我会以另一种方式提出您的问题:是否可以比通过telnet连接更容易调试内核?

对于这个问题,我的答案是:是的,确实如此。至少在X86 / X64架构上使用虚拟化。我正在使用VirtualBox运行客户操作系统,我可以在本地计算机上进行调试。我也使用VirtualKD(http://virtualkd.sysprogs.org/)来加速调试机器(主机)和VM之间的通信。

VirtualKD包含一个修改来宾Windows'boot.ini的软件包,因此您可以通过选择Windows向您显示的正确菜单项在启动时启用调试。