45

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

错误应用程序名称:w3wp.exe,版本:7.5.7601.17514,时间戳:0x4ce7afa2
错误模块名称:clr.dll,版本:4.0.30319.18034,时间戳:0x50b5a783 异常
代码:0xc00000fd 错误偏移量:0x000000000001a840
错误进程
应用程序启动时间: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

4 回答 4

81

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

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

  1. 打开 DebugDiag 并单击添加规则。
  2. “崩溃”应该已经被选中。点击下一步。
  3. 选择“特定的 IIS Web 应用程序池”,然后单击下一步。
  4. 选择应用程序池,然后单击下一步。
  5. 您应该在“高级配置”窗口中。单击高级设置下的例外。
  6. 单击添加异常并选择堆栈溢出,操作类型为完整用户转储
  7. 单击确定并保存并关闭。

下次发生 StackOverflowException 时,您将有一个故障转储。现在需要解释转储文件。

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

  1. 要使用 WinDbg,您需要获取符号文件。下载符号文件并将它们放在本地文件夹中。
  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

在结果中,应该清楚问题是什么(您可能会看到一堆行显示重复调用的函数)。

于 2013-08-20T13:01:14.487 回答
2

以上答案的一些补充。开发在用户登录时出错的 Explorer 扩展。所以对于用户来说,它看起来是“闪烁的屏幕”(当资源管理器尝试启动并崩溃,然后重新启动等)。在另一个安装了DebugDiag 和WinDbg 的用户帐户下登录。我在今天(2014 年 1 月 13 日)使用带有 .Net 4.0 的 Windows 8.1 和所有最新更新尝试在本地下载一些符号,但由于签名不正确,WinDbg 无法加载 clr.pdb。

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

于 2014-01-13T14:59:06.130 回答
0

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

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

于 2014-02-20T10:36:11.443 回答
0

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

由于为该应用程序池服务的进程中的一系列故障,应用程序池“DankAppPool”被自动禁用。

下面:

为应用程序池“DankAppPool”提供服务的进程与 Windows 进程激活服务发生了致命的通信错误。进程 ID 为“5704”。数据字段包含错误号。

和:

QueueMonitor 服务意外终止。它已经完成了 32 次。将在 60000 毫秒内采取以下纠正措施: 重新启动服务。

至少 QueueMonitor 服务是一个起点。

于 2017-10-13T14:17:52.957 回答