购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.4 模拟调试运行

模拟调试详见第3章,这里仅做简单介绍。默认情况下,kd和osloader项目编译的是内核调试文件,要实现模拟调试,需要对工程项目做一些更改:

在kd和osloader属性页中,在配置属性→C/C++→预处理器下的预处理器定义中,添加SIMULATE_DEBUG。在osloader属性页中,在配置属性→链接器→系统下的子系统中,选择“控制台(/SUBSYSTEM:CONSOLE)”。

重新编译链接后,按F10键启动osloader.exe程序,或者先下断点然后按F5键直接运行,如图1.9所示。

图1.9

中断下来后,按F11键进入KdpInitSystem函数观察调试系统的初始化过程,或直接按F5键让osloader.exe继续运行,直到和WinDbg连接而中断下来为止,如图1.10所示。

图1.10

现在WinDbg就连接上了osloader.exe控制台程序。注意,这虽然是个Win32应用程序,不是操作系统内核,但是它所显示的和连接操作系统内核是一模一样的。在这种情况下,我们进入了双重调试模式,osloader.exe被Visual Studio和WinDbg所调试。所以,任何运行的流程都能监控,可以双向下断点,可以观察COM通信包内容。下断点后,可以在Visual Studio中挂起osloader.exe查看内存情况。示例如下。

查看执行流程:

查看寄存器:

查看内存:

反汇编:

查看模块:

在WinDbg中按F5键交出控制权后,Visual Studio 2008中的中断如图1.11所示。

图1.11

执行流程从调试引擎核心返回后被Visual Studio 2008中断在int 3这行代码,这时调试控制权从WinDbg转交给了Visual Studio 2008,这就是双重调试模式。如果不想用Visual Studio 2008启动osloader.exe,也可以单独运行osloader.exe,最终也可以与WinDbg连接,这通过注册异常回调实现。注意,这里调试的不是内核,而是应用程序osloader.exe,所以osloader后面的流程是不能正常运行的,像分页机制之类不属于应用程序的范畴,Win32应用程序不能运行特权指令。但既然可以模拟调试引擎,那么内核下的模块就没有什么不能模拟的了,比如Bochs就是模拟了整个操作系统的运行硬件环境。

早先在设计本书时,笔者曾经设计模拟过内存管理和对象管理部分,但经过考虑后,把这部分去掉了,因为系统与WinDbg连接上以后,就没必要模拟了,WinDbg能观察到整个系统内核的初始化,当然也包括在osloader初始化阶段的物理内存的收集和分页机制的开启。这部分内容参见第4章。 tIkfe0OXbcK8g6d4KJLq/3Q2mjnTDyRUlVOSWkeYr55MTugqi30Sq3vysm9LhuQo

点击中间区域
呼出菜单
上一章
目录
下一章
×