繁体   English   中英

使用WinDBG识别缺陷函数

[英]Using WinDBG to Identify Defective Function

我已经从7.1 Windows SDK安装了WinDBG。 然后使用VC ++ 2008,我创建了一个程序'CleanPayload.exe',它只包含一个'main'和一个故意包含缺陷的函数的调用。 它是一个包含调试符号的发布版本。 我将该程序打开到WindDBG然后

  1. 做了一个.sympath+来指示PDB对于该程序的位置。
  2. 做了一个ld *加载所有符号
  3. 做了一个lm来验证所有符号都已加载(我的程序的私有符号,Windows库的公共符号)。

然后我运行程序,它抛出了第一次机会异常,这是相当期待的。 如下:

(910.12a0): WOW64 breakpoint - code 4000001f (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
ntdll32!LdrpDoDebuggerBreak+0x2c:
771e0f2b cc              int     3 

但是,当我要求WinDBG向我显示堆栈时,它并没有向我显示我的程序'CleanPayload.exe'。 相反,它告诉我这个:

0:000:x86> kb
ChildEBP RetAddr  Args to Child              
004bf5ec 771c122b 7efdd000 7efde000 7724206c ntdll32!LdrpDoDebuggerBreak+0x2c
004bf764 77192187 004bf7d8 77140000 7c185e6a ntdll32!LdrpInitializeProcess+0x132f
004bf7b4 77179e89 004bf7d8 77140000 00000000 ntdll32!_LdrpInitialize+0x78
004bf7c4 00000000 004bf7d8 77140000 00000000 ntdll32!LdrInitializeThunk+0x10

我需要做什么才能显示堆栈跟踪(1)包含我的程序和(2)抛出异常的函数?

更新我遵循拉里的建议,跑过第一个例外,并得到以下结果:

0:000:x86> g
ntdll!NtTerminateProcess+0xa:
00000000`76faf97a c3              ret
0:000> kb
RetAddr           : Args to Child                                                           : Call Site
00000000`74c6601a : 00000000`00000000 00000000`000de600 00000000`000ddc80 00000000`74c60304 : ntdll!NtTerminateProcess+0xa
00000000`74c5cf87 : 00000000`0030f988 00000000`0030dba8 00000000`7efdb000 00000000`0030f934 : wow64!whNtTerminateProcess+0x46
00000000`74be276d : 00000000`77150190 00000000`74c50023 00000000`00000000 00000000`0030fab8 : wow64!Wow64SystemServiceEx+0xd7
00000000`74c5d07e : 00000000`00000000 00000000`74be1920 00000000`000de820 00000000`76f93501 : wow64cpu!TurboDispatchJumpAddressEnd+0x24
00000000`74c5c549 : 00000000`00000000 00000000`00000000 00000000`74c54ac8 00000000`7ffe0030 : wow64!RunCpuSimulation+0xa
00000000`76faae27 : 00000000`004a3100 00000000`00000000 00000000`7707a1e0 00000000`7efdf000 : wow64!Wow64LdrpInitialize+0x429
00000000`76fa72f8 : 00000000`00000000 00000000`76fa8641 00000000`76fb84e0 00000000`00000000 : ntdll!LdrpInitializeProcess+0x1780
00000000`76f92ace : 00000000`000df1b0 00000000`00000000 00000000`7efdf000 00000000`00000000 : ntdll! ?? ::FNODOBFM::`string'+0x2af20
00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe

因此,遗憾的是,我仍然没有看到相关的堆栈跟踪信息。 在上面的步骤之前,我也尝试过.effmach x86命令,但它似乎没有产生任何影响。 顺便说一下,我还重新执行了整个测试,并为我正在测试的目标程序激活了app verifier。 我得到了非常矛盾的结果:

0:000> g
ModLoad: 00000000`76d40000 00000000`76e5f000   WOW64_IMAGE_SECTION
ModLoad: 00000000`74f90000 00000000`75090000   WOW64_IMAGE_SECTION
ModLoad: 00000000`76d40000 00000000`76e5f000   NOT_AN_IMAGE
ModLoad: 00000000`76e60000 00000000`76f5a000   NOT_AN_IMAGE
ModLoad: 00000000`71160000 00000000`711c0000   C:\Windows\syswow64\verifier.dll
Page heap: pid 0x1A54: page heap enabled with flags 0x3.
AVRF: CleanPayload.exe: pid 0x1A54: flags 0x80643027: application verifier enabled
ModLoad: 00000000`71130000 00000000`7115b000   C:\Windows\SysWOW64\vrfcore.dll
ModLoad: 00000000`710d0000 00000000`71128000   C:\Windows\SysWOW64\vfbasics.dll
ModLoad: 00000000`74f90000 00000000`75090000   C:\Windows\syswow64\kernel32.dll
ModLoad: 00000000`76830000 00000000`76876000   C:\Windows\syswow64\KERNELBASE.dll
ModLoad: 00000000`715c0000 00000000`7164e000   C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4926_none_508ed732bcbc0e5a\MSVCP90.dll
ModLoad: 00000000`73dc0000 00000000`73e63000   C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4926_none_508ed732bcbc0e5a\MSVCR90.dll
(1a54.17dc): WOW64 breakpoint - code 4000001f (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
ntdll32!LdrpDoDebuggerBreak+0x2c:
771e0f2b cc              int     3

0:000:x86> !avrf
*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: wow64!_TEB32                                  ***
***                                                                   ***
*************************************************************************
Application verifier is not enabled for this process.
Use appverif.exe tool to enable it.

上面的执行说AVRF: Cleanpayload.exe ... application verifier enabled ,表明它已锁定到目标。 但随后的!avrf命令显示调试符号不好,即使lm命令显示它们都已正确加载! 这到底发生了什么?

您正在运行64位版本的windbg和32位应用程序。 初始断点以64位代码运行。

如果你点击“g”你应该点击32位应用程序的初始断点,你应该能够从那里开始。

要从64位调试切换到32位调试(例如,如果按CTRL-C),请键入:

.effmach x86

这将调试器从64位模式切换到32位模式。

在您将软件打包并发送给QA或客户后,您是否在试图弄清楚如何调试实际问题? 如果是的话,还有另一种你可以使用的工具,adplus。 Adplus启动调试器,只有一个目的(实际上是两个,如果你在挂起模式下运行,但这不是你想要的),这是等待异常。 发生异常时,它将生成一个进程内存转储文件,该文件可以加载到WinDbg中。

使用这种方法,您不必依赖QA或您的客户知道如何使用WinDbg。 您只需向他们提供如何运行一个命令行的说明。 运行后,他们只需压缩整个输出目录并将其发送给您进行分析。

一旦加载到WinDbg中,内存转储文件将向您显示异常的确切位置以及当时的所有本地/成员变量(尽管如果您的代码已经优化,您可能需要为这些值进行捕获)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM