WinDbg未显示有用信息

3

首先,我要说我完全不懂WinDbg,所以这可能是一个简单的问题...

我有一个应用程序(“MyApp” - 名称已更改以保护无辜!),我正在尝试调试它,因为它会抛出异常。这只发生在用户机器上 - 我无法在开发机器上重现它。所以我在用户机器上设置了DebugDiag并捕获了完整的Dump。然后我在WinDbg中加载了Dump,并执行了analyze -vkp来尝试找出问题所在...但是这两个命令似乎都没有给我想要的信息 - 即导致问题的函数(以及希望能得到的行号)...我认为我已经通过在符号文件路径中指定'MyApp.pdb'的路径来加载符号文件:

srv*c:\symcache*http://msdl.microsoft.com/download/symbols;srv*c:\symcache*C:\dev\Customer\MyAppSln\MyApp\Debug

首先,这是kp的输出:

0:004> kp
ChildEBP RetAddr  
警告:堆栈展开信息不可用。以下帧可能不正确。
0502f474 7c347966 MyApp!DllMain+0x3e8a6
0502f4bc 7c3a2448 msvcr71!_nh_malloc(unsigned int size = <内存访问错误>, int nhFlag = <内存访问错误>)+0x24 [f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c @ 117]
0502f57c 7c3416b3 msvcp71!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Tidy(bool _Built = <内存访问错误>, unsigned int _Newsize = <内存访问错误>)+0x45 [f:\vs70builds\3077\vc\crtbld\crt\src\xstring @ 1520]
0502f610 7c3a32de msvcr71!_heap_alloc(unsigned int size = <内存访问错误>)+0xe0 [f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c @ 212]
0502f620 7c3b3f63 msvcp71!wmemcpy(wchar_t * _S1 = 0x04e463b9 "Ҹ???", wchar_t * _S2 = 0xffffffff "--- memory read error at address 0xffffffff ---", unsigned int _N = 0x4e25212)+0x14 [f:\vs70builds\3077\vc\crtbld\crt\src\wchar.h @ 843]
0502f640 04e463b9 msvcp71!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(class std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > * _Right = 0xffffffff, unsigned int _Roff = 0x4e25212, unsigned int _Count = 2)+0x7c [f:\vs70builds\3077\vc\crtbld\crt\src\xstring @ 601]
0502f770 04df1077 MyApp!DllMain+0x65329
0502f824 04e01b35 MyApp!DllMain+0xffe7
0502ff08 04dfe034 MyApp!DllMain+0x20aa5
0502ff48 04dfde4f MyApp!DllMain+0x1cfa4
0502ff88 7648d0e9 MyApp!DllMain+0x1cdbf
0502ffc4 773499f9 kernel32!BaseThreadInitThunk+0xe
0502ffd4 7738198e ntdll!RtlQueryInformationAcl+0x8b
0502ffec 00000000 ntdll!_RtlUserThreadStart+0x1b

这是一个堆栈跟踪,显示了在MyApp应用程序的DllMain函数中发生的错误。具体来说,这里显示了从堆栈顶部开始的函数调用列表,每个调用都包含其返回地址和当前堆栈指针(EBP)。
我特别想要解码的那一行是'MyApp!DllMain+0x65329',因为这是似乎正在执行的最后一行,而且错误发生在malloc调用中,异常显然就是从那里抛出的。我做错了什么,以至于只显示模块和偏移量而不是源文件和行号呢?
我也不确定为什么malloc调用上面的那一行又回到了MyApp - 或许有人可以解释一下。
为防万一,这是'analyze -v'的输出:
0:004> !analyze -v
*******************************************************************************
*                                                                             *
*                        异常分析                                             *
*                                                                             *
*******************************************************************************
*** 警告: 无法验证 MyApp.exe 的校验和 *** 错误: 模块加载完成,但无法加载 MyApp.exe 的符号 *** 警告: 无法验证 ThirdPartyDll.dll 的校验和 *** 错误: 找不到符号文件。默认导出 ThirdPartyDll.dll 的符号 - *** 警告: 无法验证 mdnsNSP.dll 的校验和 *** 错误: 找不到符号文件。默认导出 mdnsNSP.dll 的符号 - *** 错误: 找不到符号文件。默认导出 SLC.dll 的符号 -
FAULTING_IP: MyApp!DllMain+3e8a6 04e1f936 8b16 mov edx,dword ptr [esi]
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 04e1f936 (MyApp!DllMain+0x0003e8a6) ExceptionCode: c0000005 (访问冲突) ExceptionFlags: 00000000 NumberParameters: 2 Parameter[0]: 00000000 Parameter[1]: 00000000 尝试读取地址 00000000
PROCESS_NAME: MyApp.exe ERROR_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx" 处的指令引用了内存位置 "0x%08lx"。无法 "%s"。
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx" 处的指令引用了内存位置 "0x%08lx"。无法 "%s"。
EXCEPTION_PARAMETER1: 00000000
EXCEPTION_PARAMETER2: 00000000
READ_ADDRESS: 00000000
FOLLOWUP_IP: msvcr71!_heap_alloc+e0 [f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c @ 212] 7c3416b3 e88e0c0000 call msvcr71!__SEH_epilog (7c342346)
NTGLOBALFLAG: 0
APPLICATION_VERIFIER_FLAGS: 0
LAST_CONTROL_TRANSFER: from 00000000 to 773bbb33
FAULTING_THREAD: ffffffff
BUGCHECK_STR: APPLICATION_FAULT_ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_NULL_POINTER_READ_SHUTDOWN
PRIMARY_PROBLEM_CLASS: ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_SHUTDOWN
DEFAULT_BUCKET_ID: ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_SHUTDOWN
STACK_TEXT: 773bbb33 ntdll!RtlpAllocateHeap+0x7ad 773a6e0c ntdll!RtlAllocateHeap+0x1e3 7c3416b3 msvcr71!_heap_alloc+0xe0
FAULTING_SOURCE_CODE: 在 'f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c' 中未找到源代码
SYMBOL_STACK_INDEX: 2
SYMBOL_NAME: msvcr71!_heap_alloc+e0
FOLLOWUP_NAME: MachineOwner MODULE_NAME: msvcr71
IMAGE_NAME: msvcr71.dll
DEBUG_FLR_IMAGE_TIMESTAMP: 3e561eac
STACK_COMMAND: dds 7740c078 ; kb
FAILURE_BUCKET_ID: ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_SHUTDOWN_c0000005_msvcr71.dll!_heap_alloc
BUCKET_ID: APPLICATION_FAULT_ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_NULL_POINTER_READ_SHUTDOWN_msvcr71!_heap_alloc+e0

可能是如何在WinDbg中设置符号?的重复问题。 - Thomas Weller
2个回答

8
如果您认为 PDB 文件应该在符号路径中,请运行以下命令:
!sym noisy
.reload MyApp.dll
kp

!sym noisy会导致调试器提供更详细的信息,说明为什么无法加载符号 - 没有找到MyApp.pdb,找到但不匹配等。这将帮助您找出为什么没有加载符号。!sym noisy再次关闭冗长的符号输出。


6
当您设置符号路径时,是否重新加载了它们?
.reload
我不确定您添加的
srv*c:\symcache*C:\dev\Customer\MyAppSln\MyApp\Debug
对符号路径产生了预期的影响。我通常首先在.sympath中列出所有本地路径,最后一步使用Microsoft符号服务器进行配置,即执行.symfix+:
.sympath C:\dev\Customer\MyAppSln\MyApp\Debug
.symfix+ c:\symcache
之所以首先列出本地路径是因为调试器无需检查远程服务器上的PDB文件(那里根本没有),而只需在本地检索它们。
无论如何,您的问题是MyApp的符号未加载,因此堆栈跟踪无法正常工作。调试器从顶部开始向后遍历堆栈,这就是为什么您会看到MyApp - 这是发生访问冲突的地方。由于调试器此时没有符号,因此只能猜测导致顶部函数的调用链是什么。并且它通过跟随误导性的路径猜错了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接