我在一台64位机器上运行一个高流量的ASP.NET站点。由于应用程序中的一些旧组件,我正在以32位模式运行IIS。我将此特定的Web应用程序运行在启用Web Garden选项的应用程序池内(在8核机器上运行6个进程)。
每周一两次,其中一个进程会飙升到100%的CPU利用率,导致网站大幅减速,因此我的计划是等待发生这种情况,内存转储有问题的进程,然后使用WinDbg查找导致线程飙升的原因,以确定代码出现了什么问题。
我以前使用WinDbg进行过调试,以找出网站上发生死锁的原因,但那是几个月前的事情,我记不得如何使其工作了。(顺便说一句,这是一个记录你所做的一切的教训。)
我在运行站点的Windows 2003服务器上运行WinDbg,以防止任何DLL版本问题。到目前为止,我的步骤如下,请告诉我我在哪里出错了,以获得我收到的错误消息。
1.首先使用UserDump内存转储尖峰进程,使用以下命令,其中3389是进程的ID: userdump -k 3389
2.将转储加载到x86版WinDbg中。
3.由于我在64位机器上运行32位,因此我首先加载内存转储,然后: .load wow64exts .effmach x86
4.确保我的符号路径包括包含我的应用程序PDB文件的目录: .sympath+ c:\inetpub\myapp\bin
5.“仅加载SOS”失败,并显示“系统找不到指定的文件”的错误,因此我采用以下完全限定路线,它可以正常工作: .load c:\windows\microsoft.net\framework\v2.0.50727\sos
从这里开始,我迷失了。 我尝试任何SOS命令,例如!threads,只会得到此错误:
Failed to load data access DLL, 0x80004005
那个错误还伴随着一系列我应该验证的项目编号列表。我已经验证了我正在运行最新版本的调试器,mscordacwks.dll文件确实与mscorwks.dll文件在同一个目录中,并且我正在与转储文件相同的体系结构上进行调试。
我也运行了神奇的“
.cordll -ve -u -l
”命令,但那并没有解决任何问题。当我执行它时,总是会收到“CLR DLL status: No load attempts
”的提示。然后我尝试“.reload
”,这会产生一些警告,如“WARNING: wldap32 overlaps dnsapi
”。我希望它说的像“CLRDLL: Loaded DLL C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll
”这样,但它没有。