崩溃转储 - 使用WinDbg解决.NET应用程序中未经管理的代码崩溃

7

我正在尝试了解WinDbg工具,以分析我们在生产服务器上的崩溃转储。

当我运行!analyze -v时,我得到以下结果:

0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

GetPageUrlData failed, server returned HTTP status 404
URL requested: http://watson.microsoft.com/StageOne/w3wp_exe/7_0_6002_18005/49e03238/unknown/0_0_0_0/bbbbbbb4/80000003/00000000.htm?Retriage=1

FAULTING_IP: 
+14935130
00000000`00000000 ??              ???

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 0000000000000000
   ExceptionCode: 80000003 (Break instruction exception)
  ExceptionFlags: 00000000
NumberParameters: 0

FAULTING_THREAD:  00000000000029b0

DEFAULT_BUCKET_ID:  WRONG_SYMBOLS

PROCESS_NAME:  w3wp.exe

ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION}  Breakpoint  A breakpoint has been reached.

EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid

MOD_LIST: <ANALYSIS/>

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

MANAGED_STACK: !dumpstack -EE
OS Thread Id: 0x29b0 (0)
Child-SP         RetAddr          Call Site

PRIMARY_PROBLEM_CLASS:  WRONG_SYMBOLS

BUGCHECK_STR:  APPLICATION_FAULT_WRONG_SYMBOLS

LAST_CONTROL_TRANSFER:  from 000000007749c0b0 to 00000000775e6d5a

STACK_TEXT:  
00000000`0012f6c8 00000000`7749c0b0 : 00000000`00000000 000007fe`faf07e6b 00000000`00000000 000007fe`f9c015f0 : ntdll!ZwWaitForSingleObject+0xa
00000000`0012f6d0 000007fe`f9c03e74 : 00000000`00000158 00000000`ffb35de0 00000000`00000000 00000000`00000158 : kernel32!WaitForSingleObjectEx+0x9c
00000000`0012f790 00000000`ffb3235a : 00000000`fffffffe 00000000`00000001 00000000`007e6400 00000000`0000008c : w3wphost!AppHostInitialize+0x280
00000000`0012f7f0 00000000`ffb33b71 : 00000000`00000000 00000000`ffb33ce5 00000000`00000000 00000000`00000000 : w3wp!wmain+0x466
00000000`0012f980 00000000`7748be3d : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : w3wp!PerfStopProvider+0x199
00000000`0012f9c0 00000000`775c6a51 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd
00000000`0012f9f0 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d


STACK_COMMAND:  ~0s; .ecxr ; kb

FOLLOWUP_IP: 
w3wphost!AppHostInitialize+280
000007fe`f9c03e74 f6052998000003  test    byte ptr [w3wphost!g_dwDebugFlags (000007fe`f9c0d6a4)],3

SYMBOL_STACK_INDEX:  2

SYMBOL_NAME:  w3wphost!AppHostInitialize+280

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: w3wphost

IMAGE_NAME:  w3wphost.dll

DEBUG_FLR_IMAGE_TIMESTAMP:  49e0420f

FAILURE_BUCKET_ID:  WRONG_SYMBOLS_80000003_w3wphost.dll!AppHostInitialize

BUCKET_ID:  X64_APPLICATION_FAULT_WRONG_SYMBOLS_w3wphost!AppHostInitialize+280

WATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/w3wp_exe/7_0_6002_18005/49e03238/unknown/0_0_0_0/bbbbbbb4/80000003/00000000.htm?Retriage=1

Followup: MachineOwner

我真的很难弄清楚什么是什么。从我的理解来看,这里有一些有趣的部分:

EXCEPTION_CODE and STACK_TEXT.

我对WinDbg非常陌生,这是我第一次使用这个工具。我在Google上搜索了很久,但似乎没有找到正确的答案。

我的目标是:

  1. 理解stack_text的输出格式
  2. 尝试查看每个函数的输入参数

这是解决问题的正确方法吗?


我得到了与!analyze -v相同的结果。请告诉我问题出在哪里? - AlexMAS
2个回答

10

网络上有很多好的教程,甚至在WinDbg帮助文件(.chm)中也有。一个不错的地方是 WinDBG 教程 - 简介 或者 Tess的博客, If broken it is, fix it you should

对于你的情况,第一步是将WinDbg指向正确的符号。从上面的输出可以看出,你的符号路径可能不正确或没有指向任何PDB文件。在调试器中执行以下操作:

.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
这将指示调试器使用Microsoft公共符号服务器来获取操作系统组件的PDB文件;它会将这些文件缓存到您的c:\symbols文件夹中。如果要添加另一个符号路径(例如,包含应用程序的PDB文件的文件夹),可以使用由分号分隔的路径列表或者只需使用.sympath+命令逐个添加新路径。
设置完符号路径后,再次运行!analyze -v 或按照上面教程中的步骤进行操作,以查看是否获得更好的结果。

1
谢谢您的输入。我现在就开始查看这些教程。 虽然我已经在WinDbg中设置了符号路径,所以我很惊讶您说它们没有被加载。您是如何看到的?您知道问题可能是什么吗? 路径已设置为我的计算机上的有效路径,URL也是正确的。 - Jean-Francois
1
".symfix" 命令将符号路径设置为 MS 符号服务器。尝试使用 "!sym noisy" 来获取符号查找失败的详细信息。 - Naveen
1
抱歉回复晚了。有两个明显的错误符号提示。首先,!analyze 显示了明显的 "WRONG_SYMBOLS" 消息作为主要问题。其次,函数进入 w3wp 的偏移量有点大(一个为 0x280,另一个为 0x199)。正如 Naveen 所说,!sym noisy 后跟 .reload 将允许您获取详细信息,了解它在哪里找到 pdbs 以及为什么没有找到。 - nithins

5

如果您拥有正确的符号,堆栈跟踪应该是可读的。您可以尝试以下步骤:

  1. 加载转储文件。
  2. 运行 .symfix
  3. 打开“符号文件路径”菜单
  4. 添加应用程序的 .PDB 文件路径
  5. 勾选“重新加载”复选框
  6. 运行 !clrstack -p 以带参数转储堆栈。

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