1 调试驱动
WinDbg是调试Windows Driver的重要工具。要想进行调试,必须选择一种Host和Target的连接方式,我这里选择的是串口连接,使用串口线将Host和Target连接起来。
1.1 准备一个例子
之前做过AVStream的相关项目,我们就编译一个WDK中AVStreame的例子,启动x86 Checked Build Environment,进入\7600.16385.0\src\AVStream\avshws目录,敲入”build -ceZg”,编译通过则例子就准备好了。
1.2 设置Target
首先拷贝一份启动项,在命令行下执行”bcdedit /copy {Current} /d {MyDebug}”。然后使用msconfig配置启动项,运行msconfig打开System Configuration,进入Boot,选择MyDebug,进入Advancedoptions,勾选Debug,Debug port, Baud rate设置为115200,点击OK退出,将MyDebug设置为default启动项。这样系统就会以Debug模式启动了。
将编译后的avshws.sys及avshws.inf拷贝到Target,通过Device Manager安装驱动。打开DeviceManager->Add Hardware->Install the hardware that I manually select from alist (Advanced),选择Sound, video and gamecontrollers,然后从Hard Disk找到相应的inf文件,安装即可。
由于avshws是一个AVStream的fitler,可以通过GraphEdit来使用,在GraphEdit->Graph->InsertFilters->WDM Streaming Capture Devices下可以找到avshws Source这个filter,加入到graph,右键点击Capture,然后Render Pin,这个Garph就创建好了,点击Play可以切换到Play状态。Target侧的准备工作就好了,下面我们来设置Host。
1.3 设置Host
运行WinDbg,File->Kernel Debug,如下设置,其中com口依据实际情况进行设置:
点击OK,从新启动Target,带系统启动之后应该可以考到WinDbg已经连接到Target了,然后设置正确的File->SymbolFile Path(即pdb所在目录)和File->Source FilePath,使用Ctrl+Break可以使WinDbg进入Break状态,在Break状态可以进行断点的设置,查看变量的情况等,就和普通的IDE没有什么区别了。设置几个断点,然后运行Target上的Graph看看是否可以断下来。
1.4 断点的设定(bp,ba)
在kd>命令行下可以使用命令进行断点设置。
bp, 之前只作为普通的断点使用,其实它可以更强大一些,完整命令如下:
bp[ID] [Options] [Address [Passes]]["CommandString"]
我们可以设置断点hit多少次之后停下来,例如:bp moudle!function+0x1a510 , 断点hit 10次后停下来。
也可以设置为断点hit之后打印一段话不停下来,例如:bp module!function +0x1a5".echo run to here; g" ,打印run to here,不断下来.
也可以打印某个变量的值,例如:bp moudule!function+0x1a5 "dt mystruct;.echo mystructin module; g" , 打印mystruct变量的数据,一个结构的各个成员将被打印.
ba, 某个地址被访问之后断点起作用,这种断点对于某些莫名的内存问题的调试非常有用,完整命令如下:
ba[ID] Access Size [Options] [Address[Passes]] ["CommandString"]
可以设置某个地址被写就断下来,例如:mystruct->parm1的地址为0x9bf116b9, 可以设置 ba w1 0x9bf116b9 ,即当mystruct->parm1被写时就会断下来.
2 调试应用程序及DLL
使用WinDbg调试应用程序和DLL可以避免在Target安装庞大的IDE,只要把编译好的工程整体拷贝到Target,运行WinDbg,File->Attach to aProcess(可以调试DLL,Attach一个DLL的调用者) 或者 File->OpenExecutable,然后设置正确的Symbol path和Source Path即可,很方便。