如何调试w3wp clr.dll错误

时间:2013-08-20 12:56:58

标签: asp.net iis crash-reports w3wp

我的客户端在两台生产服务器上安装了一个ASP.NET应用程序(与NLB平衡,但这无关紧要)。 两个服务器每隔3-4小时就会崩溃,并显示以下事件查看器错误:

  

错误应用程序名称:w3wp.exe,版本:7.5.7601.17514,时间戳:0x4ce7afa2
  错误模块名称:clr.dll,版本:4.0.30319.18034,时间戳:0x50b5a783
  异常代码:0xc00000fd故障偏移:0x000000000001a840
  错误进程id:0xd50
  故障应用程序启动时间:0x01ce97fe076d27b4
  错误的应用程序路径:c:\ windows \ system32 \ inetsrv \ w3wp.exe
  错误模块路径:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll报告ID:e0c90a5f-0455-11e3-8f0e-005056891553

我不知道如何调试或从哪里开始。当崩溃即将发生时,服务器处理器的使用率会跃升至100%并保持不变。故障的过程是w3wp.exe。我甚至不确定我的代码是否产生了错误。这是IIS 7.5。任何指针都将非常感激。

4 个答案:

答案 0 :(得分:66)

看起来你有一个StackOverflow Exception,它是由无限递归(一个重复调用自身的函数等)引起的。这不能被常规的try / catch块捕获。您可以使用 DebugDiag WinDbg 跟踪问题。

可以将DebugDiag配置为在发生StackOverflowException时生成故障转储。在https://www.microsoft.com/en-us/download/details.aspx?id=49924下载。

  1. 打开DebugDiag并单击“添加规则”。
  2. 应该已选择“崩溃”。单击“下一步”。
  3. 选择“特定的IIS Web应用程序池”,然后单击“下一步”。
  4. 选择应用程序池,然后单击“下一步”。
  5. 您应该在高级配置窗口中。单击“高级设置”下的“例外”。
  6. 单击“添加例外”并选择“堆栈溢出”,“操作类型为完全用户转储”
  7. 单击“确定”并保存并关闭。
  8. 下次发生StackOverflowException时,您将遇到崩溃转储。现在需要解释转储文件。

    Windows调试工具是Windows SDK的一部分,可以在http://msdn.microsoft.com/en-US/windows/hardware/gg463009/下载。

    1. 要使用WinDbg,您需要获取符号文件。 Download the symbol files并将它们放在本地文件夹中。
    2. 打开WinDbg。在“文件”菜单上,单击“符号文件路径”。
    3. 在符号路径框中,文档说要键入以下命令:SRV*your local folder for symbols*http://msdl.microsoft.com/download/symbols,但是我只是放入符号的本地文件夹,它工作正常。
    4. 退出并再次打开WinDbg,然后打开Crash Dump并找到DebugDiag创建的转储文件。
    5. 在命令行中,键入.loadby sos clr
    6. 现在输入!CLRStack
    7. 在结果中,应该清楚问题是什么(你可能会看到一行显示重复被调用的函数的行。)

答案 1 :(得分:2)

上述答案的一些补充。 开发Explorer扩展,在用户登录时出错。所以对于用户而言,它看起来像是闪烁的屏幕" (当探险家尝试启动并崩溃,然后重启等)。 登录另一个安装了DebugDiag和WinDbg的用户帐户。 我今天(2014年1月13日)使用Windows 8.1和.Net 4.0以及所有最新更新 尝试在本地下载几个符号,但WinDbg因为错误的签名而无法加载clr.pdb。

使用符号在线解决 - 使用" SRV * http://msdl.microsoft.com/download/symbols"作为符号路径。

答案 2 :(得分:0)

另一个原因可能是“无限递归功能”。当发生infitine循环时,Windows尝试避免死锁并禁用相关的应用程序池。

我今天遇到了同样的问题。我有一个递归函数,列出parentproject-sub项目。一个项目设置为自己的父项目,当重用函数尝试列出所有父项目时,无限循环发生。

答案 3 :(得分:0)

我能够查看事件查看器 - > Windows日志 - >系统并找到

  

应用程序池'DankAppPool'因为自动禁用   服务于该应用程序池的进程中的一系列失败。

在下面:

  

为应用程序池“DankAppPool”提供服务的进程遭遇致命伤害   Windows进程激活服务的通信错误。该   进程ID是'5704'。数据字段包含错误编号。

  

QueueMonitor服务意外终止。它已经完成了32   时间(s)。将在60000中采取以下纠正措施   毫秒:重启服务。

至少QueueMonitor服务是一个可以开始的地方。