Win7系统中使用WinDbg与虚拟机调试驱动程序的方法和要点

编辑:quers 2016-06-06 13:56:59 来源于:系统城 1. 扫描二维码随时看资讯 2. 请使用手机浏览器访问: http://wap.xtcheng.cc/xtjc/11729.html 手机查看

  Windbg本地调试工具是驱动级调试工具,在Win7系统中调试过程涉及系统驱动,所以用WinDbg是最佳选择。一般情况下,驱动调试需要两台电脑进行配合。一台电脑作为主导进行驱动调试,另一台电脑作为目标机进行驱动安装。在只有一台电脑的情况下,目标机可以使用VMware虚拟机调试。这对于计算机的配置要求比较高。阅读下文了解Win7系统中使用WinDbg与虚拟机调试驱动程序的方法和要点。(长文,请耐心操作)
 

Win7系统中使用WinDbg与虚拟机调试驱动程序的方法和要点

  VMware Support 中说,自 4.0.18.0 版本之后的 WinDbg 都支持了通过 pipe 来进行调试,不过微软对此并没有任何说明。所以,在VMware中虚拟被调试的系统,然后通过VMware虚拟一个com端口。使用这个虚拟的端口,就可以用 WinDbg 进行调试了。
 

  使用WinDbg和虚拟机调试Win7驱动程序:

  驱动调试攻略(WinDbg)

  驱动调试是一个系统级调试方式,所以调试工具用WinDbg是最佳选择。驱动调试一般情况下,需要两台电脑进行。一台作为主机进行驱动调试,另一台作为目标机进行驱动安装。当然如果没有多余的电脑,我们可以安装VMware模拟系统调试(虚拟机)。只是对电脑的配置要求比较高。本文介绍使用WinDbg及WMware进行调试的具体设置及方法。这些资料在网络很难找到,笔者也是吸取了他人很多宝贵意见才完成的,供大家学习讨论。

  VMware Support 中说,自 4.0.18.0 版本之后的 WinDbg 都支持了通过 pipe 来进行调试,不过微软对此并没有任何说明。所以,在VMware中虚拟被调试的系统,然后通过VMware虚拟一个com端口。使用这个虚拟的端口,就可以用 WinDbg 进行调试了。
 

  具体步骤如下

  1、安装和设置WinDbg,WMware。

  首先,请到微软官方网站下载WinDbg工具。

  http://www.microsoft.com/whdc/devtools/debugging/default.mspx

  建议使用6.0以上版本的WinDbg做为调试工具。WMware也可以在网站上找到,当然使用高版本比较好。安装过程比较简单,就不在此多做介绍。唯一要注意的是,安装完虚拟机后,请在VMware主菜单“VM”中选择“Install VM Tools…”,完成系统驱动文件的安装。

  安装完这两个软件后,请在VMware中安装跟你的电脑版本相同的操作系统。例如:你的电脑安装的是WindowsXP Professional,那么最好在Vmware中安装相同版本。至少是相同的系统,Windows XPßà Windows XP、Windows 2000ßà Windows 2000。这样会在驱动调试过程中避免不必要的麻烦。笔者使用的操作系统为Windows XP Professional。

  我们将使用电脑的COM1口最为调试口。

  1.1、设置 VMware 的虚拟com ;

  1.2、运行 VMware ,点击 “Edit virtual machine settings” ;

  2、点击 “Add.。.” 来运行 VMware 的 Hardware Wizard ;

  3、选择 “Serial Port”,点 “下一步”;

  4、选择 “Output to named pipe”,点 “下一步”;

  5、第一框里保持默认的 “//。/pipe/com_1” ;

  第二框里选“This end is the server.”

  第三框里选“The other end is an application.”

  选中 “Connect at power on”

  然后点击 “Advanced》》”

  6、选中 “Yield CPU on poll”(VMware Support 中提到了这一点),然后点完成;

  7、这样就完成了虚拟com的设置;

  8. 重新启动一下;

  8.1设置 VMware 虚拟出来的 guest os

  9、编辑虚拟机中C盘根目录下的boot.ini文件。

  在c:/下,可以找到boot.ini,可以用记事本打开它,或者命令行方式

  C:/》attrib -s -h -r boot.ini

  C:/》notepad boot.ini

  我们需要在 guest os 的启动项上加些参数,才能够使用WinDbg调试它。我们可以在现有的行后面直接加参数,不过强烈推荐复制一个新行,在新行的后面加参数。这样在调试启动有问题的时候,我们可以方便的换回原来的启动方式。下面就是我改好的boot.ini。

  在boot.ini文件中添加以下代码:

  multi(0) disk(0) rdisk(0) partition(1) /WINDOWS=“Microsoft Windows XP Professional-Debug” /fastdetect /debugport=COM1 /baudrate=115200

  10、在 guest os 的设备管理器中把com1端口的速度也就是“每秒位数”项,设为和上面一样的115200。

  打开vmware中winxp的设备管理器,选择端口(com1), 双击这个“com1”,在弹出的对话框中。

  10.1、设置真实系统(主机)com。

  11、回到我们的真实系统(主机)中,重复第10步。

  11.1、设置真实系统(主机)WinDbg 。

  12、设置WinDbg的快捷方式,及其运行参数:

  我们需要告诉WinDbg通过pipe进行连接和连接的速度。

  可以在命令提示符(cmd.exe)下加参数 -k com:port=//。/pipe/com_1,baud=11520,pipe 运行WinDbg(VMware Support 中没有提到 baud=11520 这个参数,其实这是个比较重要的参数)。

  更方便的方法是在桌面建立一个WinDbg的快捷方式,在该快捷方式的属性,“目标”框中,加上参数 -k com:port=//。/pipe/com_1,baud=11520,pipe 。这样运行这个快捷方式启动的WinDbg就完成了设置。参数的具体作用,可以参考 WinDbg 的帮助文件。

  在快捷方式的属性中,将目标(Target)改为:

  “C:/Program Files/Debugging Tools for Windows/windbg.exe” -b -k com:pipe,port=//。/pipe/com_1,resets=0

  命令参数的意义

  -b:一旦主机目标机之间建立起连接,立刻中断目标机

  -k:内核调试

  Com:设置连接目标机的通信端口(此处为命名管道)和波特率(此处为115200)

  -y:设置符号文件路径

  13、设置WinDbg参数

  现在我们假设你的驱动代码放在D:/mydriver目录中;系统级Symbol文件存放在C:/WINDOWS/Symbols目录中,这些Symbol文件是从微软的网站上http://msdl.microsoft.com/download/symbols下载而来,这个网址是不可以用IE直接打开的,WinDbgà Fileà Symbol File Path.。.界面中选择Reload,WinDbg会自动帮你下载;驱动生成的Symbol文件存放在D:/mydriver/objchk_wxp_x86/i386目录中。

  13.1、设置驱动Symbol路径,WinDbg-》File-》 Symbol File Path.。.为

  SRV*C:/WINDOWS/Symbols*http://msdl.microsoft.com/download/symbols; D:/mydriver/objchk_wxp_x86/i386

  13.2、设置驱动源文件路径,WinDbg-》File-》 Source File Path…为D:/mydriver

  13.3、为了保险起见,我们同时设置系统变量。

  My Computer -》 Properties-》 Advanced Tab-》 Enviroment Variables-》

  Add._NT_DEBUG_BAUD_RATE=115200

  _NT_SYMBOL_PATH=SRV*C:/WINDOWS/Symbols*http://msdl.microsoft.com/download/symbols

  _NT_ALT_SYMBOL_PATH = D:/mydriver/objchk_wxp_x86/i386

  _NT_SOURCE_PATH = D:/mydriver

  14、启动VMware,将主机目录C:/WINDOWS/Symbols下的拷贝到虚拟机的相同位置。同时请把驱动编译后生成在D:/mydriver/objchk_wxp_x86/i386目录下的*.pdb、*.sys、*.map、*.exp、*.lib文件一并拷贝到两个系统的C:/WINDOWS/Symbols目录中。

  15、重新启动VMware,这个时候先不敲回车键。

  16、在主机中运行之前设置好的WinDbg快捷方式。直到在WinDbg命令窗口中出现“Waiting to reconnect.。.”,此时打开VMware,敲回车键进入虚拟机。到这里所有的设置工作就全部完成了。

  16.1驱动安装及调试,这里其大家注意,由于我们目前用的是虚拟机,所以安装驱动程序的时候一定要把VMware设置到全屏状态。

  17、编辑你要调试的源代码,在你需要调试的代码中添加硬断点。如果不添加硬断点,将没有办法进入所调试的程序中。具体方法如下:

  在你需要调试的程序中加入以下代码:

  extern “C” {

  #include <wdm.h>

  //或者是#include <winddk.h>

  }//放在文件开头

  DbgBreakPoint();//放在需要调试的地方

  重新编译驱动程序,记住一定要更新把重新生成的*.pdb、*.sys、*.map、*.exp、*.lib文件一并拷贝到两个系统的C:/WINDOWS/Symbols目录中。

  18、打开VMware,Ctrl+Alt+Enter进入虚拟机全屏模式。插入需要调试设备的硬件,笔者调试的目标设备为USB。当USB插入主机后,直接由VMware识别到这个USB设备,指定驱动位置,系统将会在你设置硬断点的地方停下来。这个时候你就可以回到WinDbg,进行单步调试了。你还可以在程序中添加软断点,“F9”或者“bp MyApp!MyFunction”。

  18.1、两台电脑调试说明

  两台电脑调试跟借助VMware调试有所不同,不同之处有以下几个方面。

  18.2、需要自己制作一条Null Modem Cable. 请参考以下电路。将两台电脑连接起来。

  管脚信息说明:

  9-Pin NULL Modem Cabling

  3 2 Transmit Data

  2 3 Receive Data

  7 8 Request to Send

  8 7 Clear to Send

  6,1 4 Data Set Ready and Carrier Detect

  5 5 Signal Ground

  4 6,1 Data Terminal Ready

  25-Pin NULL Modem Cabling

  2 3 Transmit Data

  3 2 Receive Data

  4 5 Request to Send

  5 4 Clear to Send

  6 20 Data Set Ready and Carrier Detect

  7 7 Signal Ground

  20 6 Data Terminal Ready

  18.3、WinDbg快捷方式参数设置

  “C:/Program Files/Debugging Tools for Windows/windbg.exe” -b -k com:port=//。/ com1,resets=0
 

  Windbg简明教程

  Windbg是Microsoft公司免费调试器调试集合中的GUI的调试器,支持Source和Assembly两种模式的调试。Windbg不仅可以调试应用程序,还可以进行Kernel Debug(新版本对于XP+操作系统支持Live kernel debug),同时结合Microsoft的Symbol Server调试应用程序和Kernel非常得利。Windbg支持x86,IA64,AMD64。

  Windbg的基本用法:

  基本设置

  由于Windbg是GUI调试器,所以在设置方面可以通过菜单,也可以通过命令。我只说明最方便的办法:),那请先打开Windbg吧

  符号路径设置,Ctrl+S在弹出的窗口中输入你的符号路径,路径的格式只要符合Windows操作系统路径格式即可,路径可以多个,中间以分号间隔,如: d:/symbols/win2k3_en;个人感觉Windbg的强大功能之一在于Windbg会自动到Microsoft的服务器上下载符号表文件(.dbg或.pdb,有时DLL和EXE也会下载),只要在符合表路径里做如下设置:srv*d:/symbolslocal*http: //msdl.microsoft.com/download/symbols,这样如果相关符号表在d:/symbolslocal目录没有找到的话, Windbg会自动在Microsoft的Symbol Servers上下载。如果你是调试自己的应用程序的话,建议你将自己应用程序的*.pdb文件的路径放在前面这样对Windbg来说查找起来比较快。

  源文件路径设置:Ctrl+P在弹出的窗口里指定你的源代码文件的路径,路径格式只要符合Windows操作系统的格式即可,可以指定多个,中间以分号间隔。

  可以将你的设置进行保存,File-》Save Workspace。
 

  开始调试

  可以创建一个子进程进行调试,也可以对正在运行的程序进行调试,方法如下:Ctrl+E打开一个应用程序并可指定运行参数进行调试;F6从对话框中选择当前正在运行的进程调试。

  对于调试子进程,通常Windbg会在应用程序运行之前中断,此时你可下一些想要的断点:

  以Notepad.exe 为例,如果你还没有符号表文件的而又设置了MicrosoftSymbol Servers的话,你得先等一下,因为Windbg会自己自动到Microsoft上下载相关的符号表,在命令提示符的位置如果没有出现0: 000》这个标记表示Windbg正在忙。


  表达式格式

  无论在那条指定里都会涉及这个问题:数制,语法。Windbg支持C++和 MASM两个表达式格式,@@用于即时改变语法格式,即在MASM下使用@@指令来使用C++的语法解释器,反之亦然。Windbg数制的表示0x表示 16进制,0n表示10进制,0t表示8进制,0y表示2进制;Windbg默认数制为16进制,n指认用于设置数制;默认表达式语法是MASM,。 expr 指令用于设置表达式语法解释器。本文均使用MASM为默认语法解释器。大小问题,通常如果不特别说明,Windbg对指令不区分大小

  断点指令:BP,BM,BA,BL,BC,BD,BE

  BP 在指定的地址设置断点

  bp notepad!WinMain,在Notepad的WinMain函数处下断点。

  断点的位置可以用符号表示,也以直接使用地址及Windbg的Pseudo-Register(虚拟寄存器),如$exentry表示进程的入口点,可以使用bp @$exentry在进程的入口点设置断点,对于Notepad当前入口点为01006420,也可以直接 bp 01006420,等效于bp notepad!WinMainCRTStartup.

  BM 使用模式匹配设置断点,需要符号表支持

  bm 值一提,在符号表合法的情况下(符号表中包含私有符号的时候),bm可能通过模式一次下多个断点,bm mydriver!FastIo*指定可以将所有与FastIo*模式相匹配的函数下断点,如FastIoRead,FastIoWrite等。但是bm 需要full or export symbols支持,Microsoft的提供的符号表不是都支持的,通常我们自己编译的程序的符号表(Windbg显示为private pdb symbols)默认是支持的。

  BA (Break on Access)

  顾名思义,对内存访问下断点。对于在多核或多处理器调试的时候很有用,对于调试多线程也很有用,应该说用处很多,比如对一个全局变量设置断点,ba mydriver!gMonitoredDevices,如果如果你认为这个变量的值被莫名的修改了,相信通过BA设置的断点,你很快就能找到是谁修改的。

  BL(List),BC(Clear),BE(Enable),BD(Disable)

  这四个指令是分别用于列表,清除,开启和禁用断点,也是使用非常频繁的指令。

分享到:

热门图文

热门搜索

返回顶部