Windows应用程序调试策略(一)
简介
本文将介绍如何利用Windows下的调试工具(Windbg,NTSD,DrWatson..)结合Symbol文件在Win2K,WinXP等环境下调试VC++ User-Mode应用程序.
关键字
应用程序调试,WinDbg,Symbol,User-Mode,Kernel-Mode
目录
1.Windows环境下的调试工具;
2.Symbol Files(符号文件);
3.WinDbg的使用;
4.NTSD的使用;
5.DrWatson的使用;
6.Windows Services的调试;
7.WinDbg进阶.
Windows环境下的应用程序调试工具;
a.CDB和NTSD
CDB和NTSD是控制台程序,用来调试应用程序,两者在界面形式,支持的命令,使用方使上差别不大,CDB可以在调试工具包(Debugging Tools for Windows package)中得到,NTSD是Windows自带的,你可以在Windows System32目录下找到它.
b.WinDbg
WinDbg是一个强大的基于Windows界面的调试工具,它可以用来调试应用程序(User-Mode)或者是内核模式的程序(Kernel-Mode),WinDbg可以像VC++ 一样在被调试的程序中设置断点,察看变量的值,察看内存的情况,而且它还支持很多的调试命令使得调试者可以很充分的分析被调试的程序,你可以在微软的网站上免费下载WinDbg的最近版本(http://www.microsoft.com/ddk/debugging/).
c.DrWatson
Windows自带的调试器,它没有提供前面提到的CDB,NTSD,WinDbg那么多的调试命令,它的主要用途是在应用程序崩溃后产生log,dump文件使得调试者事后及时地看到崩溃的现场环境以便于定位崩溃的原因和位置.DrWatson也是Windows自带的,在使用之前需要先将其注册成系统默认的当前调试工具.
Symbol Files(符号文件)
不管是对CDB,NTSD,WinDbg等支持及时调试的调试工具还是DrWatson这种事后调试工具符号文件(Symbol Files)都是很重要的,下面我们来讲讲符号文件.
当我们用VC++编写一个Sample.DLL(Win32形式的或者是MFC形式的)的时候,我们通过设置 VC++的编译开关可以让VC++在编译的时候产生对应于该DLL的符号文件(Sample.PDB,当然你也可以取其它的你认为满意的名字),该Sample.PDB中就会包含Sample.DLL的调试信息,具体包括:
1.全局变量;
2.局部变量;
3.函数名和它们的入口地址;
4.FPO Data(Frame Pointer Omission),frame pointer是一种用来在调试调用堆栈中找到下一个将要被调用的函数的数据结构源代码的行序号(Source-line numbers);
有了符号文件或者说有了这些调试信息有什么好处呢?据个例子来说,有了Sample.PDB,调试器就可以在Sample.DLL发生崩溃的时候明确的定位出是Sample.DLL中哪一个函数出错,如果没有符号文件调试器将让你看一堆的汇编语句,毫无疑问,这将给你的调试工作带来很大的困难.
对于大多数应用程序来说毫无例外的要调用到Windows提供的API,这些API存在于系统的DLL, EXE等二进制文件中,所以我们很有必要得到类似于GDI32.DLL,Kernel32.DLL之类的系统 DLL以及其他系统文件(我指的是二进制文件)的符号文件,这样我们在调试我们自己的应用程序的时候就能很清晰地看到我们的应用程序调试系统提供的函数的情况,我们可以在微软的网站上下载(下载地址详见附录)对应于不同操作系统版本的符号文件,注意,当我们的Windows在安装了符号文件以后又打了补丁或升级了Windows部件的话符号文件需要相应的更新!这很容易理解:当微软升级WindowsXP下的system32.dll的时候肯定需要重新编译改DLL的源代码,这时候产生的符号文件肯定和老版本的system32.dll产生的符号文件不一样.
当我们下载并安装符号文件后需要做一些配置使得调试器能找到这些符号文件,如果你需要让你的VC++知道符号文件的地址你可以按照下面的步骤设置:
1.打开VC6++;
2.选择Tools->Options;
3.点击Options对话框中的Directoties;
4.下拉Show directories for下拉框,选择 Executable;
5.将你的符号文件路径添加到该处;
6.点击确定完成.
如果你需要让NCDB,NTSD,WinDbg,DrWatso32知道符号文件的地址,你需要设置一个环境变量_NT_SYMBOL_PATH,下面是在Windows XP Pro中设置的例子:
设置完成后如果你用WinDbg打开被调试程序,这时候你打开File->Symbol File Path..就可以看到WinDbg已经找到了符号文件的位置:
同样道理,当我们要调试我们自己的应用程序的时候我们也需要我们自己程序的符号文件,当你有该程序的源代码的时候(我想你肯定应该有吧)你可以通过设置VC++的编译开关来产生,下面是VC++6中设置的方法(其他版本的VC++请参看其帮助文档):
同样你需要通过设置环境变量等方法来让调试器知道你的符号文件的位置,这样有了调试器,符号文件以及环境变量的设置你的调试环境就搭建起来了,下面通过调试一个例子程序介绍如何利用WinDbg调试应用程序.