为应用程序池"X"提供服务的进程与Windows进程激活服务发生致命的通信错误

Sco*_*ott 19 asp.net debugging iis-7 windbg http

我正在IIS 7.5下运行ASP.NET 4.0应用程序.一天几次,我们的应用程序池意外回收.发生这种情况时,我们的系统日志显示以下事件:

为应用程序池"X"提供服务的进程与Windows进程激活服务发生致命的通信错误.进程ID为'5768'.数据字段包含错误编号.

要么

为应用程序池"X"提供服务的进程无法响应ping.进程ID为"1032".

几乎总是,在应用程序日志中的完全相同的时间有一个相应的事件,如下所示:

Faulting application name: w3wp.exe, version: 7.5.7600.16385, time stamp: 0x4a5bcd2b
Faulting module name: clr.dll, version: 4.0.30319.269, time stamp: 0x4ee9ae83
Exception code: 0xc00000fd
Fault offset: 0x00001916
Faulting process id: 0x508
Faulting application start time: 0x01cd4d8958ecf9ad
Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Report Id: 8dcc413b-b98a-11e1-8075-001c23d6d910
Run Code Online (Sandbox Code Playgroud)

因此,我安装了IIS调试工具并设置了崩溃规则,指定了"特定的IIS Web应用程序池",没有记录第一次机会异常,也没有"高级设置"(例外,断点,事件)下的任何内容.

我也(同时)使用以下命令行从Windows调试工具运行ADPlus:

adplus -crash -pn w3wp.exe -NoDumpOnFirst -o c:\logs
Run Code Online (Sandbox Code Playgroud)

但是,由于我已经附加了调试器,我在系统日志中收到了几条"警告"级别的消息(关于"进程服务应用程序池'X'遭遇了致命的通信错误......"),但是我我不再在应用程序日志中获得相应的错误级别事件.

我唯一能得到的是以下(其中约有50个):

[6/18/2012 7:50:25 PM] Thread exited. Exiting thread system id - System ID: 3300. Exit code - 0x800703e9
[6/18/2012 7:50:25 PM] Thread exited. Exiting thread system id - System ID: 4992. Exit code - 0x800703e9
[6/18/2012 7:50:25 PM] Thread exited. Exiting thread system id - System ID: 5456. Exit code - 0x800703e9
[6/18/2012 7:50:25 PM] Thread exited. Exiting thread system id - System ID: 4924. Exit code - 0x800703e9
Run Code Online (Sandbox Code Playgroud)

退出代码0x800703e9表示某处堆栈溢出,这很幸运,因为一旦我找到它就应该很容易修复.

但是,为了做到这一点,我需要从崩溃转储中获取更多信息,以便我可以使用WinDbg打开它们并使用"!clrstack"命令来查明我的问题.

我的问题是:我是否正确配置了调试工具,还是我误解了事件日志?每当我在系统日志中看到有关"Windows进程激活服务的致命通信错误"的事件时,我们的应用程序池似乎都在回收,但是当这些事件发生时,我没有从IIS调试工具或ADPlus获得任何故障转储信息.由于某种原因,由于我已经附加了调试器,因此我在应用程序日志中不再收到与我的系统日志警告事件相对应的"错误"事件.不知道为什么.我不知何故需要在其中获取包含CLR信息的完整崩溃转储,以便我可以找出问题所在.

我能想到的另一件事是Windows错误报告服务没有运行.不确定是否需要.

谢谢你的帮助.

sev*_*tov 5

您在应用程序日志中获得的异常代码和线程退出代码都表明您有堆栈溢出。令人费解的是,当线程退出并出现堆栈溢出错误时,为什么进程没有崩溃。无论如何,要在堆栈溢出异常时启用中断,命令是:

sxe sov
Run Code Online (Sandbox Code Playgroud)

请注意,在您的情况下,您需要使用 x86 版本的调试器,因为您的应用程序池配置为 32 位进程。