2011-03-31 36 views
10

我已经从7.1 Windows SDK安装了WinDBG。然后在VC++ 2008中,我创建了一个程序'CleanPayload.exe',它只包含一个'main'和一个对故意包含缺陷的函数的调用。它是一个包含调试符号的发行版本。我打开该程序进入WindDBG然后使用WinDBG识别有缺陷的功能

  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命令,但似乎没有影响。顺便提一下,我还使用为我正在测试的目标程序激活的应用程序验证程序重新执行了整个测试。我非常矛盾的结果:

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命令显示它们都已正确加载!这里发生了什么?

+0

你找出异常原因吗? – 2014-12-12 20:51:59

回答

11

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

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

从64位到调试32位调试切换(如果打CTRL-C例如),式中:

.effmach x86 

将从64位模式调试程序切换到32位模式。

+0

很明显,64位WinDBG中的32位调试是问题的一半。另一半是为32位程序找到正确的调试符号。注意这个讨论:'http:// www.eggheadcafe.com/software/aspnet/29430292/teb32-and-peb32-type-in​​fo-missing-from-public-wow64pdb.aspx'。也就是说,如果我正在调试64位应用程序,为了使'应用程序验证程序'开心,我必须确保在'srv *'之前的符号路径中放置'c:\ windows \ system32'。 – 2011-04-05 00:45:38

+0

好的,我也忘记了符号路径问题。 – 2011-04-05 01:54:18

+0

@LO:你能再解释一下吗? 64位代码中的初始断点是什么意思?具体来说,你可以将它与windbg32下的相同场景进行比较吗?此外,生成的这个初始异常:是否由调试器插入,以便调试对象在调用时停止?谢谢。 – Sabuncu 2012-01-21 20:07:58

1

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

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

一旦加载到WinDbg中,内存转储文件将显示当时异常和所有本地/成员变量的确切位置(尽管如果您的代码已经优化,您可能不得不为这些值着想)。

+0

作者已经获得了转储。尽管如此,他仍然有问题分析。 – 2014-12-12 20:47:49

+0

@YauheniSivukha - 可能不是当我发布这个答案... 3年多前 – DXM 2014-12-15 17:26:16