Debug - WinDbg

来源:互联网 发布:微信红包数据 编辑:程序博客网 时间:2024/06/09 09:12

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即可,很方便。

3        !htrace 命令

这个命令是近期才发现的,可见学无止境,知道的永远是皮毛。Htrace主要是用来调试句柄的,既可以Kernel  mode也可以user mode。具体可以参考WinDbg的帮助文档,要想使用htrace还需要一个调试的工具gflags.exe,这个工具存在于Debugging tools目录中,如果安装了WDK,这个目录也就应该存在了,如果没有可以在WDK的安装盘中找到dbg_x86.msi安装文件,然后进行安装就可以了。