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