[内核编程] Windebug双机调试环境搭建
Windebug双机调试环境搭建
开始进行内核编程/驱动编程的调试工作是非常烦人的,由于程序运行与内核层不受操作系统的管控,所以容易引起主机蓝屏和崩溃是常有的事。这也就使得内核程序的调试成了一大问题,而在资源有限的时候,利用虚拟机进行调试是一个很好的选择,这样一来即使是虚拟机因为调试问题而发生蓝屏或崩溃的问题也不至于殃及主机。
今天在搭建环境过程中还是遇到了不少问题,虽然关于这方面的文章已经很多了,但是有一些细节还是会不小心被忽略,而这往往导致最后环境搭建的失败。在这里就相当于做个总结吧,记录整个环境搭建的过程
一、准备工作
a、虚拟机
我自己用的是VMware Workstation 10,当然也可以使用其它的虚拟机,不过这个也挺好用的,可以在网上搜一下就能找到下载资源。
b、Windbg
这是一款不错的内核调试软件。注意一定要下完整,刚开始就是因为下了一个不完整的资源导致一直配不成功。关于Windbg的获取可以登录:
http://msdn.microsoft.com/en-us/windows/hardware/hh852365,网站中详细的说明了Windbg的获取方式,在WinDDK的安装路径7600.16385.1\Debuggers下就是Windbg,所以在安装WinDDK的时候应该选择完整安装,还有大量的例子。。。
c、操作系统
我这里用的是windows XP SP3
二、环境搭建
双机:一台调试机(主机)+一台被调试机(虚拟机)+一个串口线。 注:Windebug安装在调试机上
2.1虚拟机的配置
串口配置:
1、打开VM中对应的虚拟机设置界面,如下图
2、注意查看是否已有串口存在,如果有需要移除,否在会导致windebug与虚拟机连接不上!!!这里尤为注意打印会占用串口,如下图所示。
在此需要将打印机移除,否在将导致windebug无法与虚拟机连接!!!!!
如果已有串口存在的时候,依旧添加新串口的话就会出现如下图的情况:
新添加的串口的设备名称为“串行端口2”而不是“串行端口”,是由于串行端口1已经被打印机设备占用,根据这个情况也可以判断是否已有串口存在,自习检查并确定没有串行端口存在以后
可继续下文步骤。
3、添加串口
如下图在【虚拟机设置】窗口的下方选择【添加】按钮
4、进入【添加硬件向导】,硬件类型选择
在【硬件类型】框中选择【串行端口】然后点击窗口右下角的【下一步】按钮
5、串行端口类型选择
在【串行端口】复选框中选择【输出到命名管道】,然后点击对话框右下角的【下一步】按钮
6、指定插槽
配置如下图所示,其中命名管道的com_1为管道名称,可以作改动,但是在用windebug进行连接的时候也要注意名字的一致!!
我这里保留默认名。两台机器,一台为【该端是服务器】保留默认设置,最后一个下拉框选择【另一端是应用程序】。最后注意吧【启动时连接】的复选框选上。
然后点击【完成】按钮即可完成配置。
7、完成串行端口添加
如下图所示,可以看到新添加的串行端口,并且占用的串行端口1,名字不再是“串行端口2”
打开虚拟机进行配置:
打开虚拟机中Windows的系统盘,在文件夹选项中设置为“显示所有文件”,“不隐藏系统保护的文件”,然后可以在系统盘下看到一个boot.ini文件。
如果在C盘下找不到boot.int文件,可通过一下方式解决:
打开电脑属性——高级——启动与故障恢复——在系统启动栏目下选择手动编辑,就打开boot.ini了。
一般boot.int的内容如下:
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
可以将最后一行复制一行并且粘贴占[operating systems]下,然后修改一些参数即可,修改后内容如下:
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="XP Debug" /fastdetect /debug /debugport=com1 /buadrate=115200 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
其中timeout为等待时间30s,而[operating systems]下的两行中,第一行为启动调试运行选项,第二行为正常启动选项
注:
因为在boot.ini中设置的debug输出端口为com1,所以在虚拟操作系统的设备管理器中设置COM1端口的波特率为115200。其他保持默认设置。至此虚拟机设置完毕,重启时即可使用windebug进行连接。
2.2Windebug配置
下面是调试机上的windebug的启动参数,使之连接一个管道,并把这个管道当做一个串口来处理。
windbg.exe -b -k com:por\\.\pipe\com_1,baud=115200,pipe
或
windbg.exe -b -k com:pipe,port=\\.\pipe\com_1,resets=0
上面的命令可以在控制台(cmd窗口)转到windebug所在目录下后执行。为了以后使用方便,最好建立一个windbg.exe的快捷方式,创建方法如下:
右键单击windbg.exe选择【创建快捷方式】——》右键单击创建好的快捷方式图标并选择【属性】——》在属性对话框的【目标】一栏加上空格后添加
-b -k com:por\\.\pipe\com_1,baud=115200,pipe
或者
windbg.exe -b -k com:pipe,port=\\.\pipe\com_1,resets=0
——》点击保存即可。
打开虚拟机,启动到调试模式之后哦,马上在命令行中输入命令或者用快捷方式打开WinDbg,就可以开始调试了。windbg.exe会显示连接上的信息。如下组图:
图中显示的等待时间为之前在boot.ini中设置的timeout值,而【请选择要启动的操作系统:】菜单下的选项则为设置的[operating systems]下的菜单项。这里选择第一项安回车进入或者等时间到了以后自动进入。
系统以调试模式启动以后,windbg就会选择连接信息,如上图
2.3 设置Windows内核符号表
打开Windbg,选择菜单项的“File”->“Symbol File Path”,然后填下:
srv*c:\Symbols*http://msdl.microsoft.com/download/symbols
如下图如果我们勾选了Reload,那么相当于输入了.reload命令,这时开始下载:
点击【OK】开始下载。。。如下图
以上方法是设置是WinDbg自动用HTTP协议从微软的网站上下载所需的符号表。下载完后可以在C:\Symbols目录中查看,这个路径也可以指定为其它路径。
注:
(1)以上只有需要的时候才会下载;对于已经下载的以后就直接用这个文件夹里面的符号表了。
(2)有时候下载不一定总是成功。如果发现符号表并没有下载下来,请多试几次。(虚拟机不用关闭,多试几次)
(3)实际调试驱动时还要加上自己驱动对应的符号表。(驱动对应的符号表可以在编译路径下的objchk_wxp_x86\i386目录下找到)
(4)当然也可以把系统的Symbols从微软的网站上一次性打包下载下来再解压到C盘的Symbols文件夹。从http://msdn.microsoft.com/en-us/windows/hardware/gg463028可以下载到系统对应的符号表(注意是和虚拟机对应的系统版本)
(5)之后关闭Windbg,会提示是否保存,点击是,保存。