WinDbg+虚拟机调试驱动的一些细节 分享

网上关于这方面的资料比较多,但觉得某些细节没太注意.

经过自己的测试,写出一些心得.

1)
将 WinDbg 发送一个快捷方式,并修改在快捷方式上右键=>”属性”
将”目标”中的 WinDbg 文件名后添加 “-k com:port=\\.\pipe\com_1,baud=115200,pipe” , 如下:
“C:\Program Files\Debugging Tools for Windows\windbg.exe” -k com:port=\\.\pipe\com_1,baud=115200,pipe

2)
打开虚拟机中的 c:\boot.ini 文件(之前去掉”只读”属性),复制一行
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Windows Server 2003, Enterprise” /fastdetect
即添加了一个启动选项,并修改为:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Windows Server 2003, Enterprise[Debug]” /fastdetect /debug /debugport=com1 /baudrate=115200
即添加了调试选项,调试端口以及串口的速率.
保存.

3)
关闭虚拟机里的目标windows系统(必须,否则在”Settings…”里的”Add…”将为灰色,不可选状态),
选择目标windows系统的”Settings…”选项,在”Hardware”选项中,点击下面的”Add…”按钮.
选择”Serial Port”点击”Next”,再选择”Output to named pipe”,”Next”,
这一向导中,前两项不修改,最后一项修改为”The other end is an application.”,
如果这里存在”高级”选项,则在其中选择”Yield CPU on poll”[注:有些虚拟机在这里并没有”高级”选项,则在”Finish”后,选择”Serial Port”,再勾选右下角的”Yield CPU on poll”],
“Finish”.

“OK”,完成”Virtual Maching Setting”.

4)
打开虚拟机中的目标Windows系统,选择”Windows Server 2003, Enterprise[Debug]”后(注意这里不能回车,必须先启动WinDbg后回车,要不然可能连不上),立即打开之前创建的WinDbg快捷方式(若先打开WinDbg,则会报找不到’com:port=….’等信息).

5)
连接上虚拟机中的目标windows系统后,立即发送一个WinDbg中的”Debug”=>”Break”来中断它.

6)
设置”Symbol”路径,”Source”路径和”ImagePath”路径(若有多个,则用”;”号隔开).
如:
“File”=>”Symbol” 里设置:”G:\虚拟机共享文件\Win2003Symbols;G:\虚拟机共享文件\GiveIO”,勾选”Reload”,”OK”. (第一个是Windows的符号[这里要注意,符号应该是虚拟机内Windows系统对应的],第二个是要调试的驱动的符号)

“File”=>”Source” 里设置:”G:\虚拟机共享文件\GiveIO”, “OK”. (要调试的驱动的源码我放在了此目录中)

“File”=>”Image File Path” 里设置: “G:\虚拟机共享文件\GiveIO”, “Reload”, “OK”. (我把要调试的驱动程序放在了此目录中)

“File”=>”Open Source File”, 打开驱动源文件.

7)
在要调试的驱动程序上下断点(这里我调试的驱动模块名为”GiveIO”,后面是在”DriverEntry”入口点下断点[bu设置的是延迟断点]):
bu GiveIO!DriverEntry
按”F5″(或在命令行中用”g”命令),即可让虚拟机中的目标Windows顺利启动.

8)
在虚拟机中运行要调试的驱动程序,即可运行到断点处.

9)
一些说明:
在已运行的Windows目标系统中调试指定驱动:
首先应使WinDbg产生一个断点,使用WinDbg中的”Debug”=>”Break”,此时目标Windows系统就会中断.
此时使用:
bu GiveIO!DriverEntry
命令,在指定驱动的模块名的入口点下断点(GiveIO为此处的驱动模块名).
运行驱动后,即会在驱动的DriverEntry处断下来,此时就可以进行跟踪调试了.

bl命令可以查看已下的断点
bc清除断点,如果后面跟”*”,则清除所有断点.

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

46 − 41 =