Windows调试工具入门2(WinDbg基本调试器设置)_第1页
Windows调试工具入门2(WinDbg基本调试器设置)_第2页
Windows调试工具入门2(WinDbg基本调试器设置)_第3页
Windows调试工具入门2(WinDbg基本调试器设置)_第4页
Windows调试工具入门2(WinDbg基本调试器设置)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Windows调试工具入门2基本调试器设置Windows调试工具入门-2本篇介绍Windows调试工具的基本设置和基本操作方法。这里我们会用一个测试程序一步一步说明如何使用WinDbg开始调试工作。首先用VC建立一个名为TestDebugl的控制台项目,并生成它。、符号、源码和可执行映像路径设置使用WinDbg开始调试工作之前,最重要的就是配置好各种环境了。这使得调试器可以正确识别调试目标中的各种变量、函数等等,使得我们能够进行符号化调试或者源码调试,而不是只能在一堆汇编代码中转圈。ProjectSettingsResourcesSRObject/librarymocfutesGenerate

2、deGen匕rate皿母pfMjProjectOptions在EnableprofilingFLinkIncrementsIFySettingsFor:;Win32ReleaseOutputfilename:ReleasefTestDebuglXX9TestDebugl首先来看一下未设置环境之前的样子。使用刚才说的TestDebugl项目,为了对比更清晰,用Release进行编译,链接选项中选中生成map文件和调试信息,如下:kernel32Jibuser32.libgdi32.libwinspool.libcomdlg32.1ibadvapi32JibsheU32Jibde32Jibolea

3、ut3ZJibuuidJibodbc32.libodbccp32.libCategory:Generalkerne!32.libuser32.libgdi32.libwinspooUibcomIgnorealldefaultGeneralDebugC/C+LinkC/C+选项卡中设置如下:SettingsFor:Win32ReleaseGeneralDebugC/C+LinkResourcesTestDebuglCategory:GeneralWarninglevelOpttmlzalronsWarningsaserrorsGeneratebrowMaximizeSpeed#in序代码如下:e

4、ludestdafx.hinfoProgramDatabasePreprocessordefirtitronsWIN32,NDEBUGCONSOLEMBCSProjectOptions/nologo/ML/W3/GXZi/O2/D1WIN321/DNDE/DLCONSOLE/DM8CS/FpRelease/TestDebugl.pch/YutdafK-h#includevstdio.hintmain(intargc,char*argv)printf(TestDebug1.cpp);return0;编译之后,将Release目录下的TestDebug1.pdb剪切到其他目录下(如果没有这样做,由

5、于编译出来的程序中包含了符号文件路径,调试器可以直接使用exe中的信息找到pdb文件,而不需要设置路径)。在map文件中可以看到像下面这样的内容:0001:00000000_main00401000fTestDebug1.obj说明main函数位于401000地址处。通过WinDbg的File-OpenExecuteable菜单打开TestDebug1.exe,可以在调试器命令窗口中看到下面的内容:FileEditVie-.vDebugWindcv/HelpCommand剽野4却|画乔榭耙IS!GlEinEinOEl|Micrcsoft(R)VindovsDebuggerVersion6.10

6、.0003.233X86HicroscftCorporation.Allrightsreserved.iiifiage00400000ntdll.dll皇符号并不是程序入口点,这是由WinDbg实现造成的,这Cojftmandlme:C:tRccuesktopTstDebvg1*Invalid*SymbolsearchpthiSymbolloadingmaybeunreliablewithoutasymbolsearchpath.Use.syjafixtohavethedebuggerchoosea岳pth-Aftersettingyoursymbolpath,use.reloadtorefr

7、eshsymbollocatiar茫*萍*歸兴黠詈轉歸蕎来醫眸#誓醫歸*詈常萍萍菁賢醉#誓聲歸轉詈来歸萍舊賢萍#来峠萍萍来*歸萍来峠醉#来礬*来*萍*,O可以看到里先不管它。.-dllirstchance)前TestDebUgI.eXe的任何符号文件。:如果想在main函数下断,这时就不能使用符号,而只能:wJ,l&ip=77547deesp=0012fb20ehpEG012b50icplOnvupeiplzrna直接使用main的地址。;.厂L1*UUMULiu.PVJ-J”口出00400ff60000addbyteptreaxialG0400ff80000addbyteptreax:*al

8、00400ffa0000addbyteptr:eax:.ad00400ffc0000addbyteptr上丄00400ffe0000addbgEptreax8jghTfea环hugl*0:ag030fQ0408030*ERROR:Symbolfilecouldnotbefound.Defaultedtoexportsymbols使用命令bp00401000在main函数设置断点,然后F5执行就可以中断到main的入口处了。断点设置和基本操作我们将在后面介绍。可以在威匚编窗口中看到这样的内容:D04(n0lW6阳0&04QD0calladdSOIretpttSIFjxjcpushesi,laov

9、esioffsetTestDebugl4-OK0O7O(0040S070)由于没有加载任何符号,所以我们看到的都是一堆反汇编代码和地址。在上一篇中已经介绍过,WinDbg不像OllyDbg这些调试器一样拥有强大的反汇编分析能力,所以仅仅靠这些看起来一团乱麻的反汇编代码,调试工作是很难开展下去的。004010050040100a0040100d00401001mnrfffoT004010115600401012be70804000号,e80600000083c40433c0TestDebugl+OxlOlO(00401010)esp,4eax*eas符号路径的设置要想在WinDbg中看到程序中的

10、符号,必须通过命令或者WinDbg菜单设置符号路径。如果还设置了Microsoft公共符号存储的话,我们不但能够看到自己程序中的符号,还能够看到Windows平台代码中的符号,这对于调试会提供很好的帮助。所谓符号路径,就是包含了程序符号信息的符号文件所在的目录路径。通常我们接触到的符号文件都是以pdb作为后缀名的。TestDebug1.exe项目如果在项目设置的Link选项中选中了生成调试信息的话(如上图中的Generatedebuginfo),那么可以在Debug或者Release目录中找到它的符号文件TestDebug1.pdb。我们通过WinDbg的File-SymbolFilePath

11、菜单,或者命令.sympath设置符号路径为TestDebug1.pdb所在的目录。例如刚才我把生成的pdb文件移动到桌面上了,所以在我的机器上就设置为:lestuecug丄rb:addbyteptreaK,al(T&stDebugl+Oxff8):addbyteptreax,al(TestDebugl+Oxffa):addbyteptrean,al(TestDebugl+Oxffc):ddbyteptveax,al(TestDebugl+Oxffe):addbyteptreaii,al(004C00401005S306000000callTestDebugl!printf(00401010)

12、CD40100aiS3c404addesp,4004D100d33c0 xoreax*eaz004D10Qfc3retTestDebugl!printf:04览00丑英裁生GQQ口ftgetTestWbugb毘(O04Q8Qgtn瀑已经可以看到TestDebug1.exe中的函瞰变量督样的符号了。而我们也可以通00401012过喩軽这样的命令直接使用符号来操作调试器。8低皿勺1!_丄口中如完成之后在命令窗口输入.reload命令,我们可以看到反汇编窗口的内容发生改变:D040DffG0000TestDebugl!wtain00400ff&C000TestDebugliiiainC04DCffa

13、0000TetDebugl00400ffc0000TestDebugl!mainfe0000TestDebug1!Main:另外,在Local、Watch等窗口中也可以直接使用符号名查看到变量的值、在CallStack窗口中可以看到函数名,等等。源码路径的设置通过上面的设置,我们可以对程序进行符号化调试。如果拥有程序的代码还可以通过设置源码路径来进行源码级调试。继续上面的工作,我们通过WinDbg的File-SourceFilePath.菜单或者.srcpath命令设置源代码保存的路径,比如我的机器上是这样:确定之后,如果当前指令指针在源文件的代码范围内,就会自动跳出源文件窗口。如果没有跳出,

14、那么可以通过File-OpenSourceFile菜单手动打开源文件。由于刚才设置的断点还没有删除,所以在源码窗口也能口看到设断的行被高亮了:nrintintargc,char*argv)常tdafx.hinclude之后就基本上可以完全通过源码窗口进行设置断点、查看变量、跟踪代码等操作。比只有符号的时候方便了很多。可执行映像路径的设置可执行映像路径一般在调试dump文件时才用得上。需要将这个路径设置成要调试的exe、dll、sys等可执行文件的路径。可以通过File-ImageFilePath菜单或者.exepath命令设置。使用微软公共符号存储除了使用自己程序的符号之外,调试时还可以使用微

15、软提供的Windows系统代码的符号。这需要修改一下我们设置的符号路径。最方便的办法是使用.symfix命令。现在我们来看一下kernel32.dll中的代码,在反汇编窗口的Offset栏中填入kernel32!OpenProcess,在我的机器上代码如下:OisassetHEfOff5et:132!OpenPrecesskernel321OpenProcess:764e8c95764ec9?7G4e8c987&4e8c9a764e8c9d764eSc战D764e8ca3764e8ca&764e8ca7764eSca9764e8cab764Scad764s8cb0764e8cb3764e8cb

16、6764e8cb77G4eScba764eScbb764e8cbe764e8ccl764eScc2764e8cc5Sbff8bec83ec208b4S10894f80b45Oc33f6f7d0lbcO83e002894Sec8d45f8506d45e050ff75088d4510508975fcc74&e0ie000000pushmovsubJitOVsbdebnHS3eueuueu1P1Xpplp8975e48975e8MOV&di*&diebpebp”esp,20heax,dwordptrebp+1Ohdwordptrebp-6*eaxeax,dvordptrebp+OCh931esi,e

17、sieaseax,eaxesix,2dwordptrebp-14hPeaKeaxyebp-9easeas,ebp-20heasdwordptrebp+8ebp+lOheaxdwordptrebp-4,esidwordptrebp-20h,lSh,esidwardebp-lChesi764e8cd28975f0movdwordptrsbp-lOh,esi注意位于764e8CCf处的那个call,现在只能看到调用了keTnel32l某个偏移JilDV的丄L!I11、111利IH财仏勢魁迴野理凹i使用命令.symfix+d:Symbols命令,注意加号要紧靠前面的文本。:Symbols符号文件的目试

18、器自动修加了一IF径。再来打开37(7&4baa8f)764e8cebc20c00OChret自己在源码路径中加入这些新的内容也可以实现相同的效果。详细的原理请参考WinDbg帮助文档关于符号服务器设置的部分内容。接下来再次使用.reload命令重新加载符号,第一次使用到的符号文件会从网上自动下载下来,所以可能有时候会等待一会。完成之后,可以看到反汇编窗口中出现了新的符号内容:DisassembfyOffset:kerne132?OpenProcesskerne丄32!OpenProcess:764e9c95764e8c97764e9c93?64e9c9a7648c9d764e8caQ764e

19、8ca3764e8ca6764e8ca7764e8ca9764e9cab764e0cad764e8cb0764eScb3?64e3cb6764eacb77$4e8cba764e8cbb?64e3cbe7G4e8ccl7$4e8cc28bf558bee93ec208b45108945(88b450c5633f6f?d8lbcO83朝028945cd45f8508d4SeO50ff75088d4510508975fcmiovpushJftOVsubJHOVJQCV3HCVpushxornegsbbendIHOVleapush丄巳apushpushleapUShjhovedi,ediebpebp,e

20、spesp20h,dwerddwordptreas,d阳口:rdesiesi,esiesseax,eaxeax,2dwordptaptrebp+lOhebp-8*eaxptrebp+OChebp-14h*eaxeas,ebp-8eaxeax,febp-20heaxdwordptrebp+8eaxrJebp卡1心11eaxdwordpti?ebp-4),esi?的函数p-2OhbiShptrnebp-lChl.esi号是我们研究Windows实现的必备利器。首先;-7调试过程中的i记忆和对各一_十_一一*-一亍常可以猜测出来函数或变量的作用,很大的方便调试。在各种调试应审强烈建议添加微软公共符号

21、的引用。kernel32!OpenPrccess+0kS3(764baaS)环境变量78b4510ifiovsak,dvordptr(ebp+10h上面介绍的各种路径都可以通过于鏗变量来进行设置。将一些常用的路径保存在环境变量中,就可以避免每次在新的工作空间中进行调试时都要重新设置的麻烦。另夕卜,VisualStudio2008也共享一些环境变量的设置,这样在使用IDE调试的时候也能方便的查看到各种符号了。常用的有下面几个:环境变量Ntbi符字就用中设置penProcess。识别;作用_NT_SOURCE_PATH=Path指定包含调试目标的源代码的路径。Path可以包含后跟一个冒号(:)的驱

22、动器符。用分号分隔多个目录_NT_SYMBOL_PATH=Path指定包含符号文件的目录树的根目录。Path可以包含后跟一个冒号(:)的驱动器符。用分号分隔多个目_NT_EXECUTABLE_IMAGE_PATH=Path录(;)。指定包含二进制可执行文件的路径。Path可以包含后跟一个冒号(:)的驱动器符。用分号分隔多个目录_NT_DEBUG_LOG_FILE_OPEN=Filename(仅CDB和KD)指定调试器用来记录输出的日志文件。_NT_DEBUG_LOG_FILE_APPEND=Filename(仅CDB和KD)指定调试器用来添加输出的日志文件。新的内容每次会添加到这个文件末尾,而

23、不是覆盖整个文件。如果设置了符号路径的环境变量的话,可能在初期使用VS2008调试MFC这样的有较多导入库的程序时会下载很多符号文件,使得启动调试的速度变慢。不过经过一段时间,大部分需要的符号都缓存到本地之后速度就会快起来。、配置日志文件进行调试时,有时候调试器命令窗口会变得很杂乱,所以常常想用.cis命令清空它。但是这样会无法再看到之前调试过程中输出的结果。另外,有时候想保存下整个调试过程的详细记录以备后面“回味”。这时,就需要用到日志文件了。可以将调试器命令窗口中出现过的所有内容都自动记录到日志文件中。创建日志文件:(仅CDB和KD)启动调试器之前,设置NT_DEBUG_LOG_FILE_OPEN环境变量。启动调试器时,使用-logo命令行选项。如-logod:logsmylogfile.txt使用.logopen命令。女口.logopen/td:logsmylogfile.txt(仅WinDbg)使用Edit-Open/CloseLogFile菜单命令。将日志添加到已有的文件末尾:(仅CDB和KD)启动调试器之前,设置_NT_DEBUG丄OG_FILE_APPEND环境变量。启动调试器时,使用-log

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论