问题描述
我正在尝试在客户的服务器(Win 2012R2)上调试问题,我们的 .NET Web 应用程序之一托管在他们的 IIS(版本 8.5.9600.16384)中。最近,我们的一位技术支持人员更改了应用程序的 Web.config 文件中的一个小内部设置,据他们说,系统没有进行任何其他更改或操作。该应用程序也没有更新,并且之前一直运行没有任何问题。
由于该更改,配置站点的 AppPool 无法再启动。根据系统事件日志,有几次尝试启动,每次都会导致工作进程崩溃,直到池的快速失败保护完全停止启动进程。
此外,由于我在客户的服务器上,因此我只有有限的调试选项。
发现
WAS 在系统事件日志中报告:
为应用程序池“[我们的池]”提供服务的进程与 Windows 进程激活服务发生了致命的通信错误。进程 ID 为“5664”。数据字段包含错误号。
由于为该应用程序池提供服务的进程中的一系列故障,应用程序池“[我们的池]”被自动禁用。
查看相应的应用程序错误日志会发现以下内容:
错误应用程序名称:w3wp.exe,版本:8.5.9600.16384,时间戳:0x52157ba0 错误模块名称:PerfMon.dll,版本:8.0.10977.0,时间戳:0x59cfb424 异常代码:0xc0000409 错误偏移:0x000f8c7b 错误进程 id:0x1620 错误应用程序启动时间:0x01d423ff75bef49f 错误应用程序路径:C:\Windows\SysWOW64\inetsrv\w3wp.exe 错误模块路径:C:\Program Files\Microsoft Monitoring Agent\Agent\APMDOTNETAgent\V8.0.10918.0\PerfMon.dll 报告 ID :b56327b3-8ff2-11e8-80d5-005056a52299 错误包全名:错误包相关应用程序 ID:
在搜索这个问题时,我主要关注 PerfMon.dll 问题和提供的错误代码 0xc0000409,这显然与注册表项损坏或堆栈缓冲区溢出有关,但在这两种情况下,我都无法弄清楚是什么原因可能是。
我还尝试了此处描述的故障转储分析 https://blogs.msdn.microsoft.com/parvez/2016/08/06/iis-application-pool-crash-and-debug-diag/
但最终它似乎只是回到原始问题的往返,因为这是在转储中发现的唯一错误:
来自 Microsoft Corp. 的 C:\Program Files\Microsoft Monitoring Agent\Agent\APMDOTNETAgent\V8.0.10918.0\PerfMon.dll 中 PerfMon!DllGetClassObject+966fb 的汇编指令导致线程 2 出现未知异常 (0xc0000409)
这基本上是我已经从事件日志中得到的。
我在这里的主要问题不仅是可能是什么原因和这个问题的潜在解决方案,而且首先是如何正确找到原因/解决方案。
更新
使用 Fusion Logs,我能够找到System.Web.DynamicData、System.Web.Extensions和System.ServiceModel.web的三个绑定错误。
操作失败。绑定结果:hr = 0x80004005。未指定的错误
程序集管理器从以下位置加载: >C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 在可执行文件 C:\Windows\SysWOW64\inetsrv\w3wp.exe 下运行 --- 详细的错误日志如下。
=== 预绑定状态信息 === LOG: DisplayName = System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 (完全指定) LOG: Appbase = [app root path] LOG:初始 PrivatePath = [应用根 bin 目录] LOG: Dynamic Base = C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\bee9e73a LOG: Cache Base = C:\Windows\Microsoft. NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\bee9e73a 日志:AppName = b83a4ee 调用程序集:(未知)。
由于依赖程序集与条件 APTCA 共享模式不匹配而拒绝代码共享
搜索这方面的任何信息,我只能找到一个与 MVC3/MVC4 相关的旧错误,这需要更改配置。不过,这与这个问题无关。这也可能意味着原始错误与 PerfMon 完全无关,原始错误只是一个奇怪的副作用。