抱歉,我想不出一个很好的方式来表达我的真正问题。
我在 64 位机器上运行一个高流量的 ASP.NET 站点。但是,由于应用程序的一些遗留组件,我有 IIS 在 32 位模式下运行。我正在一个应用程序池中运行这个特定的 Web 应用程序,该应用程序池启用了 Web Garden 选项(在 8 核机器内运行 6 个进程)。
每周一到两次,其中一个进程将飙升至 100% 的 CPU 利用率,从而导致站点的速度大幅下降,所以我的计划是等到这种情况发生,内存转储有问题的进程,然后在 WinDbg 周围戳到零用于查看代码在哪里旋转的线程。
我之前使用 WinDbg 进行过调试,以找出导致网站死锁的原因,但那是几个月前的事了,我不记得我是如何让它工作的。(作为旁注,这是记录您所做的一切的课程。)
我在运行该站点的 Windows 2003 服务器上运行 WinDbg,以防止任何 DLL 版本问题。到目前为止,这是我的步骤,请让我知道我哪里出错了,以获取我收到的错误消息。
我首先使用 UserDump 使用以下命令对尖峰进程进行内存转储,其中 3389 是进程的 ID:
userdump -k 3389
我将转储加载到 WinDbg 的 x86 版本中。
由于我在 64 位机器上运行 32 位,我首先加载内存转储,然后:
.load wow64exts
.effmach x86
我确保我的符号路径包含包含我的应用程序 PDB 文件的目录:
.sympath+ c:\inetpub\myapp\bin
仅运行 `.load 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
”。但事实并非如此。