如何调试PerfMon.dll中的0xc0000409错误?/AssemblyBinding

8

问题描述

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

最终似乎只是回到了最初的问题,因为这是在转储中找到的唯一错误信息:
PerfMon!DllGetClassObject+966fb上的汇编指令在来自Microsoft Corp.的C:\Program Files\Microsoft Monitoring Agent\Agent\APMDOTNETAgent\V8.0.10918.0\PerfMon.dll中引发了未知异常(0xc0000409),位于第2个线程。
这基本上就是我已经从事件日志中得到的内容。
我的主要问题不仅是可能导致此问题的原因和潜在解决方法,而且还要如何正确地首先找到原因/解决方法。
更新
使用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=[app root bin directory] 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 LOG:AppName=b83a4ee 调用程序集:(未知)。
因为一个相关联的程序集不符合条件APTCA共享模式,所以拒绝代码共享。
搜索任何关于此的信息,我只能找到与MVC3/MVC4有关的旧错误,需要进行配置更改。但这与此问题无关。 这也可能意味着原始错误根本与PerfMon无关,而是一种奇怪的副作用。

C:\Program Files\Microsoft Monitoring Agent\Agent\... 不是 IIS 中必需的组件。尝试在 web.config 或应用程序主机配置中搜索该路径并将其注释掉?猜测它安装了某个模块/处理程序,导致失败?可能只需要更新一下? - MisterSmith
@MisterSmith 很遗憾,到目前为止我在web.config或applicationhost.config中都没有找到任何类似的设置,也没有发现任何相关的内容。 - M.Rueck
看起来那个代理被系统中心使用了?看到了一些帖子暗示你可能需要升级或降级该代理。 - MisterSmith
1个回答

8

想要补充一下,我们在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: 

1
同样的问题也困扰了我,但我们有类似的经历。有趣的是,同一网络应用程序的以前版本可以工作。我们改变了一些 Ninject 的依赖关系,被这些问题拦住了一段时间。然而,我们定位到了所提到的服务并将其删除后,更改的应用程序(.NET 4.6)重新开始工作了。这是我们在网上找到的唯一一个示例。我们查看了来自 Windows 调试转储的调用堆栈等各种信息,找到了问题的结果,只是没有找到犯罪分子。 - Program.X
我可以确认这也是.NET 4.7的问题。我刚刚执行了链接博客文章中提到的“msiexec.exe /i momagent.msi NOAPM=1”命令,选择了修复,它删除了Microsoft Monitoring Agent APM服务。这为我解决了这个问题。 - Brian Gideon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接