WinDbg Azure应用服务@ 100%

时间:2016-12-09 07:20:11

标签: .net debugging azure-web-sites windbg

我有一个来自Azure App Service的完整minidump。它附带.dmp文件,sos.dll和mscordacwks.dll。

我有WinDbg - x86是可以打开此转储文件的版本。然后我使用.load c:\ path \ to \ sos.dll。这不会给出错误,但也没有其他输出。

下一个建议的命令,!sos.threads,给出:

无法找到运行时DLL(clr.dll),0x80004005 扩展命令需要clr.dll才能完成任务。

我已经在mscordacwks.dll上直接尝试.load,将其重命名为clr.dll。我已将该文件复制到我的符号路径中,并将其重命名为mscordaccore_X86_X86_4.6.24628.01.dll,这是我在此任务期间的某个时刻出现的。

我也试过运行DebugDiag 2分析工具,但是它说它不能加载mscordacwks,尽管它在同一个文件夹中,当它也在符号路径中时,也是当它被重命名为此处列出的特定版本时。

我只是想知道为什么我的App Service会在一段随机时间后陷入100%的CPU!我可以尝试接下来的步骤吗?

1 个答案:

答案 0 :(得分:3)

看起来你对WinDbg并不是很熟悉,所以我会比必要的更冗长。

  

WinDbg - x86是可以打开此转储文件的版本

WinDbg的任何版本和位数都可以打开转储。即使32位WinDbg也可以打开64位.dmp文件。这并不意味着您使用正确的版本来完成您想要实现的目标。

  

这不会产生错误,也不会产生其他输出。

没关系。这意味着扩展已成功加载。这很好,因为这意味着你正在使用WinDbg的正确位数。如果它真的是您使用的x86 WinDbg,则表示您有32位SOS DLL。

如果位数不正确,则会收到错误消息,就像尝试将32位DLL加载到64位进程中一样,反之亦然(在.NET中也称为BadImageFormatException

  

扩展命令需要clr.dll才能完成任务。

SOS扩展适用于.NET,因此SOS正在寻找加载到该进程中的.NET框架。这可能是

  • clr.dll适用于.NET 4 / 4.5,可能更高
  • mscorwks.dll for .NET 2/3 / 3.5
  • coreclr.dll用于Silverlight和.NET Core

从消息中,我们可以得出您有一个用于.NET 4的SOS.dll,这就是为什么它正在寻找clr.dll而不是其他东西。 Azure Web服务听起来很合理,因为Azure比.NET 2更新。

要查看.NET是否实际加载到进程中,请使用以下命令:

lm m clr
lm m mscorwks
lm m coreclr

如果这些命令中的任何一个产生了一些输出,您将知道加载了哪个版本。请注意,.NET 4和.NET 2可能并行发生(在此过程中使用的两个版本)。

  

我已经在mscordacwks.dll上直接尝试.load,将其重命名为clr.dll。

这是一个巨大的误解:

  1. .load将一些内容加载到WinDbg进程中。即使你设法在那里加载它,SOS仍然会在转储文件中搜索它。
  2. mscordacwks不是.NET框架。不要将其与mscorwks混淆。 dac 部分用于数据访问控制。它是一个DLL来管理对内存中.NET结构的访问,因为.NET有自己的内存管理。
  3. 但是,可能需要重命名它。那是一个很难的故事。您似乎已经找到了Google的结果......

      

    将其重命名为mscordaccore_X86_X86_4.6.24628.01.dll

    它走向正确的方向,但我不认为这是正确的名称。您是否介意将原始建议联系起来,以便我可以在抱怨我可能已经掌握的旧知识之前进行一些研究?

    恕我直言,名称应为

    mscordacwks_x86_x86_4.6.24628.01.dll
    

    (如果版本号正确)。

    正如@Lieven Keersmaekers已在评论中所提到的那样,拥有correct symbol path pointing to Microsoft然后再做

    !analyze -v
    

    应该从Microsoft下载必要的mscordacwks文件。这样它就会自动拥有正确的名称并位于正确的文件夹中。

      

    我也尝试过运行DebugDiag 2分析工具

    为使DebugDiag正常工作,它还需要mscordacwks。最简单的方法是使用Microsoft符号服务器,以便它可以自行下载文件。

      

    我只是想知道为什么我的App Service卡在100%CPU

    从单个崩溃转储文件中分析错误。捕获崩溃转储文件时,该过程可能只是做了“正常”的事情。

    如果您有许多具有相同调用堆栈的故障转储,则可能表示此方法处于无限循环或长时间运行循环中。要在高CPU下自动获取许多故障转储,请尝试ProcDump,请参阅how to take a good crash dump for .NET

    还有什么可能出错?

    你说你被提供了这些文件。从文件的命名,我假设它们是从发生崩溃的机器中取出的。这基本上是个好主意。请注意,PC上有许多此类文件。

    如果你运行我的工具mscordacwks Collector,你会明白我的意思。顺便说一下,该工具将检测版本并相应地重命名文件。也许你可以尝试一下,机器仍然可用。