只有初学者才能理解初学者的痛苦。
目前网上能找到的内核程序调试环境大都是使用WINDbg+VMware的,也咨询了公司的一个老鸟,他也一直这么调试。下面结合网上的一些教程和自己实际的操作整理如下:
准备软件:
1、WINDbg
http://msdn.microsoft.com/en-us/windows/hardware/gg463009
2、VMware
随便找。
3、操作系统安装软件
随便找。
4、windows符号表
http://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx
部署之前部署之前
在准备安装软件、配置环境之前需要明晰以下东西。
1、上图摘自WINDbg的帮助文档,通过这个图可以比较清晰的看出两台机器的关系:TARGET机器在调试模式下运行调试版的NDIS驱动,而HOST机器运行WINDbg调试程序。两者之间通过某种方式进行通信,TARGET机器的内核运行情况都反映在WINDbg上,而WINDbg可以控制TARGET机器的调试模式下的内核运行。
在目前的双机联调方案中,真实机器就是HOST,使用VMware虚拟一个操作系统作为TARGET,两者之间使用命名管道pipe通信。
2、两台机器上的操作系统可以不一致,例如我的环境HOST是64位的win7,TARGET是32位的winXP。TARGET是调试环境,即如此安装操作系统,我只能调试32位的驱动。但是因为我HOST是64位的,所以我在HOST上安装的WINDbg也是64位的。当然这里安装哪个版本的WINDbg并不是一一对应,具体的标准请参照WINDbg帮助文档的Choosing a 32-Bit or 64-Bit Debugger Package来选择安装哪一版本的WINDbg。
3、虚拟机里的系统在调试模式下运行,这也就是目标环境,所以我们想要调试的驱动的版本跟这个虚拟机里运行的TARGET系统是需要一样的,都是64或者都是32位。
4、最后再说一下windows符号表,这个东西我也不是很理解,不过我分析它必须跟你TARGET的操作系统版本一致。虽然windows符号表是装在HOST主机中。因为这个符号表是提供给WINDbg调试目标机的内核使用的。
根据以上内容,我的软件安装情况是
HOST(酷睿i5-2430m,win7、64位旗舰版):
WINDbg for windows(X64),其实没有单独装,是安装WDK附带的;
windows xp pacekt3 符号表
VMware workstation某版本
在VMware中安装WINDOWS XP 补丁3版作为TARGET。
配置
1、在VMware中为虚拟出的TARGET配置一个com端口。点击“Edit virtual machine settings",添加一个Serial Port,选择Output to named pipe,然后下一步时,第一个框保持默认的\\.\pipe\com_1,第二个框里选择This end is the server,第三个框选择The other end is an application,选中Connect at power on选项,在I/O mode中勾选Yield CPU on poll选项。
2、进入TARGET的操作系统,修改boot.ini文件,打开此文件在最后一行添加:(直接复制即可)
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /fastdetect /debug /debugport=com1 /baudrate=115200
怎么找到修改boot.ini或者win7的怎么办之类的单独上网百度吧,上面的语句可以让你在TARGET系统启动时经选择进入调试模式,其中debugport = com1这句挺关键,调试信息的输出是往com1上输出的,这一点要和你在VMware中添加的那个Serial Port的编号一致。以我的配置为例,在虚拟机中我添加的那个COM端口就是com2,所以这里我修改成debugport=com2。
3、进入TARGET的操作系统,设备管理器,找到步骤1时添加的端口,将波特率修改成115200.
4、接下来配置WINDbg。这里网上一般都是添加一个快捷方式,我觉得也挺方便的。
右键->新建->快捷方式,在“请键入对象的位置”输入下行,引号中是你windbg的安装目录,-y后面是你windows符号表的路径,port=\\.\pipe\com_1与虚拟机中设置的管道名一致。
"C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" -y C:\Windows\Symbols\ -b -k com:pipe,port=\\.\pipe\com_1
以上配置完成。
调试
1、启动VMware进入TARGET系统,启动页面选择第二个选项进入调试模式。点击之前制作的WINDbg快捷方式。配置正确的话会显示双方链接成功,如下图:
2、在WINDbg中设置symbol path,即在菜单file中的symbol path中把windows符号表的目录和驱动的PDB路径都加进去。以我的为例:c:\Windows\Symbols;G:\代码\小九\NetworkAnalyzer\NARNDISpassthru\objchk_win7_x86\i386
勾选reload点击OK。
3、使用windbg的命令“bu 驱动名字!driverentry”设置一个断点,当驱动在TARGET中加载时就会中断。此时你可以在
windbg中进行单步跟中了。
后续
1、在TARGET中如何加载你的驱动?我用的srvinstw先添加服务,然后在cmd中使用net start启动驱动。这个上网找就行。
2、怎么调试?我也没啥经验,看windbg的帮助和实际去调吧。