如何调试 PerfMon.dll 中的 0xc0000409 错误?/ 装配绑定

M.R*_*eck 5 .net c# iis perfmon assemblybinding

问题描述

我正在尝试调试客户服务器 (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/

但最后似乎只是回到原始问题的往返,因为这是转储中发现的唯一错误:

微软公司的 C:\Program Files\Microsoft Monitoring Agent\Agent\APMDOTNETAgent\V8.0.10918.0\PerfMon.dll 中 PerfMon!DllGetClassObject+966fb 的汇编指令导致线程 2 出现未知异常(0xc0000409)

这基本上是我已经从事件日志中得到的。

我在这里的主要问题不仅是可能的原因和解决此问题的潜在方法,还包括如何首先正确找到原因/解决方案。

更新

使用 Fusion Logs,我能够找到System.Web.DynamicDataSystem.Web.ExtensionsSystem.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 (Fully-specified) LOG: Appbase = [app root path] LOG:初始 PrivatePath = [app root bin directory] ​​日志:Dynamic Base = C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\bee9e73a 日志:Cache Base = C:\Windows\Microsoft. NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\bee9e73a 日志:AppName = b83a4ee 调用程序集:(未知)。

由于依赖程序集与条件 APTCA 共享模式不匹配而拒绝代码共享

搜索有关此的任何信息,我只能找到与 MVC3/MVC4 相关的旧错误,该错误需要更改配置。不过,这与这个问题无关。这也可能意味着原始错误与 PerfMon 完全无关,原始错误只是一个奇怪的副作用。

小智 6

只是想补充一点,我们现在在 Windows Server 2012 上遇到了这个(或一个非常相似的)问题,并通过删除 Microsoft Monitoring Agent APM 服务来解决它,如这篇相当精彩的博客文章中所述:http : //kevingreeneitblog.blogspot.com /2017/03/scom-2016-agent-crashing-legacy-iis.html

(博客文章中描述的问题应该只影响在旧的 .NET 框架版本上运行的应用程序,但我们在仅运行版本 4 的应用程序池中遇到过。)

从我们的事件日志:

Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp: 0x52157ba0
Faulting module name: PerfMon.dll, version: 8.0.11072.0, time stamp: 0x59c01c4c
Exception code: 0xc0000409
Fault offset: 0x000f8c7b
Faulting process id: 0x1ae8
Faulting application start time: 0x01d4eac448929ba3
Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe
Faulting module path: C:\Program Files\Microsoft Monitoring Agent\Agent\APMDOTNETAgent\V8.0.11072.0\PerfMon.dll
Report Id: 8a700b62-56b7-11e9-8124-001dd8b71cba
Faulting package full name: 
Run Code Online (Sandbox Code Playgroud)