WinDbg是微软开发的免费源码级调试工具。Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。在DotNet方面WinDbg是调试分析SSCLI的最佳工具,同时可以和SOS扩展一起调试分析.net程序。最近一段时间项目需要学习了一下,有感于WinDbg功能的强大。
使用WinDbg调试程序
WINDOWS调试工具很强大,但是学习使用它们并不容易。特别对于驱动开发者使用的WinDbg和KD这两个内核调试器(CDB和NTSD是用户态调试器)。本教程的目标是给予一个已经有其他调试工具使用经验的开发者足够信息,使其能通过参考WINDOWS调试工具的帮助文件进行内核调试。本文将假定开发者熟悉一般WINDOWS操作系统和进程的建立过程。
本文的重点是集成内核模式和用户态模式的图形化调试器WinDbg。KD在脚本和自动化调试中更有用,并且在资深程序员中拥有一定地位,但是本教程将集中讨论WinDbg,只会偶尔提到KD。
本文讨论的是Windows NT 4.0,Windows 2000或以后的版本,而且目标电脑的处理器基于X86架构。对于64位平台,将不会特别提及。
总之,本教程由简单介绍调试器的安装开始,大体分成2部分,基础知识和选择技术。基础知识包括基本调试命令和常用调试命令。选择技术是其他命令和在很多情况下都有用的调查方法。后者并不是调查象deadlocks, memory corruption或者resource leaks的唯一方法。第一次阅读本教程,你可能会跳过选择技术。你可以停止阅读本教程而转向微软调试器讨论组,也可以通过调试器的反馈e-mai解决更多的问题。
通往WinDbg的捷径(一)
通往WinDbg的捷径(二)
用WinDbg探索CLR世界1 - 安装与环境配置
在托管代码中设置断点(WINDBG)
用WinDbg动态脱Reflector
使用WINDBG和SOS调试死锁
使用Windbg和SoS扩展调试分析
几个常用的 WinDbg 命令
Windbg核心调试之dump分析
从Ollydbg说起-----WinDbg用户态调试教程
本节包括:
使用 !analyze 扩展
设定条件断点
将虚拟地址转换成物理地址
追踪处理器独占者
从转储文件中提取信息
确定对象的ACL
显示一个临界区
调试应用故障
SOS 调试扩展 (SOS.dll)
安装完虚拟机后,请在VMware主菜单“VM”中选择“Install VM Tools…”,完成系统驱动文件的安装。
安装完这两个软件后,请在VMware中安装跟你的电脑版本相同的操作系统。例如:你的电脑安装的是WindowsXP Professional,那么最好在Vmware中安装相同版本。至少是相同的系统,Windows XPßà Windows XP、Windows 2000ßà Windows 2000。这样会在驱动调试过程中避免不必要的麻烦。笔者使用的操作系统为Windows XP Professional。
我们将使用电脑的COM1口最为调试口。
(1) 编辑虚拟机中C盘根目录下的boot.ini文件。
C:>attrib -s -h -r boot.ini
C:>notepad boot.ini
在boot.ini文件中添加以下代码:
multi(0) disk(0) rdisk(0) partition(1) WINDOWS="Microsoft Windows XP Professional-Debug" /fastdetect /debugport=COM1 /baudrate=115200
(2) 打开vmware中winxp的设备管理器,选择端口(com1),如下图。
(3) 双击这个"com1",在弹出的对话框中,设置如下图。
(4) 关闭vmware下的操作系统。配制虚拟机的硬件,VM->Settings->Add->加一个Serial Port,选择"Output to named pipe",然后下一步,第一框里保持默认的 "\.pipecom_1"
第二框里选"This end is the server."
第三框里选"The other end is an application."
选中 "Connect at power on"选中 "Yield CPU on poll"。保存退出。
(5) 回到我们的真实系统(主机)中,重复(2)、(3)两步。
(6) 设置WinDbg的快捷方式,及其运行参数:
在快捷方式的属性中,将目标(Target)改为:
"C:Program FilesDebugging Tools for Windowswindbg.exe" -b -k com:pipe,port=\.pipecom_1,resets=0
命令参数的意义:
-b:一旦主机目标机之间建立起连接,立刻中断目标机
-k:内核调试
Com:设置连接目标机的通信端口(此处为命名管道)和波特率(此处为115200)
-y:设置符号文件路径
(7)设置WinDbg参数
现在我们假设你的驱动代码放在D:mydriver目录中;系统级Symbol文件存放在C:WINDOWSSymbols目录中,这些Symbol文件是从微软的网站上http://msdl.microsoft.com/download/symbols下载而来,这个网址是不可以用IE直接打开的,WinDbgà Fileà Symbol File Path...界面中选择Reload,WinDbg会自动帮你下载;驱动生成的Symbol文件存放在D:mydriverobjchk_wxp_x86i386目录中。
a) 设置驱动Symbol路径,WinDbgà Fileà Symbol File Path...为
SRV*C:WINDOWSSymbols*http://msdl.microsoft.com/download/symbols; D:mydriverobjchk_wxp_x86i386
b) 设置驱动源文件路径,WinDbgà Fileà Source File Path…为D:mydriver
c) 为了保险起见,我们同时设置系统变量。
My Computer à Properties à Advanced Tab à Enviroment Variables à Add.
_NT_DEBUG_BAUD_RATE=115200
_NT_SYMBOL_PATH=SRV*C:WINDOWSSymbols*http://msdl.microsoft.com/download/symbols
_NT_ALT_SYMBOL_PATH = D:mydriverobjchk_wxp_x86i386
_NT_SOURCE_PATH = D:mydriver
(8)启动VMware,将主机目录C:WINDOWSSymbols下的拷贝到虚拟机的相同位置。同时请把驱动编译后生成在D:mydriverobjchk_wxp_x86i386目录下的*.pdb、*.sys、*.map、*.exp、*.lib文件一并拷贝到两个系统的C:WINDOWSSymbols目录中。
(9)重新启动VMware,并选择如图所示。这个时候先不敲回车键。
(10) 在主机中运行之前设置好的WinDbg快捷方式。直到在WinDbg命令窗口中出现“Waiting to reconnect...”,此时打开VMware,敲回车键进入虚拟机。到这里所有的设置工作就全部完成了。
2.驱动安装及调试
这里其大家注意,由于我们目前用的是虚拟机,所以安装驱动程序的时候一定要把VMware设置到全屏状态。
(1) 编辑你要调试的源代码,在你需要调试的代码中添加硬断点。如果不添加硬断点,将没有办法进入所调试的程序中。具体方法如下:
在你需要调试的程序中加入以下代码:
extern "C" {
#include <wdm.h>
//或者是#include <winddk.h>
}//放在文件开头
DbgBreakPoint();//放在需要调试的地方
重新编译驱动程序,记住一定要更新把重新生成的*.pdb、*.sys、*.map、*.exp、*.lib文件一并拷贝到两个系统的C:WINDOWSSymbols目录中。
(2)打开VMware,Ctrl+Alt+Enter进入虚拟机全屏模式。插入需要调试设备的硬件,笔者调试的目标设备为USB。当USB插入主机后,直接由VMware识别到这个USB设备,指定驱动位置,系统将会在你设置硬断点的地方停下来。这个时候你就可以回到WinDbg,进行单步调试了。你还可以在程序中添加软断点,“F9”或者“bp MyApp!MyFunction”。
3.两台电脑调试说明
两台电脑调试跟借助VMware调试有所不同,不同之处有以下几个方面。
(1)需要自己制作一条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
(2)WinDbg快捷方式参数设置
"C:Program FilesDebugging Tools for Windowswindbg.exe" -b -k com:port=\. com1,resets=0