【问题标题】:WinDbg not showing useful informationWinDbg 没有显示有用的信息
【发布时间】:2010-11-15 21:10:20
【问题描述】:

首先让我说我是一个完全的 WinDbg 菜鸟,所以这可能是一个简单的问题......

我正在尝试调试一个应用程序(“MyApp” - 更改名称以保护无辜者!),因为它正在引发异常。这只发生在用户机器上 - 我无法在我的开发机器上重现它。所以我在用户机器上设置了 DebugDiag 并捕获了一个 Full Dump。然后我在 WinDbg 中加载了转储并执行了 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> 公里 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,std::allocator >::_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 "--- 内存读取错误在地址 0xffffffff ---", unsigned int _N = 0x4e25212)+0x14 [f:\ vs70builds\3077\vc\crtbld\crt\src\wchar.h @ 843] 0502f640 04e463b9 msvcp71!std::basic_string,std::allocator >::assign(class std::basic_string,std::分配器 > * _Right = 0xffffffff,无符号整数 _Roff = 0x4e25212,无符号整数 _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+0x65329”,因为这是似乎正在执行的最后一行,并且错误发生在 malloc 调用中,这显然是异常所在被抛出。我做错了什么使它只显示模块和偏移量而不是源文件和行号?

我也不确定为什么 malloc 调用上方的行再次回到 MyApp - 也许有人也可以解释一下。

以防万一,这是'analyze -v'的输出:

0:004> !分析-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) 异常地址:04e1f936 (MyApp!DllMain+0x0003e8a6) 异常代码:c0000005(访问冲突) 异常标志:00000000 数量参数:2 参数[0]:00000000 参数[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 调用 msvcr71!__SEH_epilog (7c342346) NTGLOBALFLAG:0 APPLICATION_VERIFIER_FLAGS:0 LAST_CONTROL_TRANSFER:从 00000000 到 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 堆栈文本: 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:机器所有者 模块名称: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

【问题讨论】:

标签: debugging windbg


【解决方案1】:

如果你认为 PDB 应该在你的符号路径中,你应该运行这样的东西:

!sym noisy
.reload MyApp.dll
kp

!sym 噪音会导致调试器提供有关它无法加载符号的原因的更详细信息 - 未找到 MyApp.pdb、找到但不匹配等。这将帮助您找出它为什么不加载符号. !sym Noise 再次关闭详细符号输出。

【讨论】:

    【解决方案2】:

    当你为符号设置路径时,你是否重新加载它们?

    .reload

    我不确定你是否添加了

    srv*c:\symcache*C:\dev\Customer\MyAppSln\MyApp\Debug

    对符号路径有想要的效果。 我通常首先在 .sympath 中列出所有本地路径,最后一步是使用 .symfix+ 来配置公共符号:

    .sympath C:\dev\Customer\MyAppSln\MyApp\Debug .symfix+ c:\symcache

    首先列出本地路径的基本原理是调试器不必检查远程服务器的 pdb(无论如何都不存在),而不是简单地在本地检索它们。

    无论如何,您的问题是未加载 MyApp 的符号,因此堆栈遍历不太有效。 调试器从顶部开始向后遍历堆栈,这就是您看到 MyApp 的原因 - 这是发生访问冲突的地方。 现在,由于调试器此时没有符号,它只能猜测是什么调用链导致了顶部的函数。 而且它会通过误导性路径猜测错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多