Kernel mode的debugging需要有一个目标机和一个宿主机。目标机运行着内核态的程序,宿主机内运行着debugger。
目标机与宿主机没有必要非要使用同一系统或者同一版本的windows。
内核态debugging不需要特定的自由版本或者检查版本(free version and checked version)的build。宿主机和目标机在free还是checked上没限制。
默认的目标机的debug输出串口为COM2,修改变量debugport可以修改这个。
默认的宿主机的输入串口为COM1. 修改_NT_DEBUG_PORT可以修改这个。
Ready目标机
若要让目标机允许内核态的debugging,要修改boot.ini文件,给它添加一个/debug选项。boot.ini一般在C盘根目录下可以找到。如果你使用的是Windows XP,那么请参考http://support.microsoft.com/kb/289022/zh-cn 来寻找修改boot.ini的方式。
一个例子:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect /MAXMEM=512 /DEBUGPORT=COM1 /BAUDRATE=115200
当Windows无法启动,你没有机会编辑boot.ini时,你可以开机时按F8,采用安全模式启动Windows。安全模式只在启动时加载最少的必要驱动和最少的系统设备,如果启动成功,你就可以编辑boot.ini了。
如果启动分区被格式化为FAT,那么你可以使用MS-dos,然后编辑boot.ini. 由于boot.ini是隐藏的,在dos中可以使用如下的命令来看到它:dir /ah.
可以使用如下的命令来去掉它的隐藏和只读属性。attrib –r –s –h boot.ini
Ready宿主机
要开始内核态或用户态的debugging,宿主机必须安装所有必要的symbol文件,还要设置一些环境变量。
如下的批处理文件可以帮助你快速设置一些环境变量。
SET _NT_SYMBOL_PATH=z:\symbols\winnt\2195\symbols
SET _NT_ALT_SYMBOL_PATH=z:\symbols\winnt\2195sp1\symbols
SET _NT_DEBUG_PORT=COM1
SET _NT_DEBUG_BAUD_RATE=115211
SET _NT_LOG_FILE_OPEN=z:\debug\debug.log
z:\debug\kd.exe -v -n
Symbol文件
Symbol文件保存有各种在运行二进制文件时用不着的信息,这些信息在debugging的时候才比较有用。典型的,Symbol文件中包含有
1. 全局变量
2. 局部变量
3. 函数名和他们的入口地址
4. FPO数据
5. 源代码行号
不管是交互式的debugging还是分析crash dump文件,都需要symbol文件,debugger需要加载它们。
注意:宿主机上安装的symbol文件应该和目标机上安装的windows版本相匹配。