无法在WinDGB中打开Azure App Service .NET Core 2转储文件(转储文件中存在2个运行时)

时间:2018-06-13 20:27:25

标签: .net azure .net-core windbg sos

我在WinDBG中打开 .NET Core进程的转储文件时遇到了麻烦。 我曾经使用WinDBG调试.NET框架转储,没有任何问题,但是来自 Azure应用服务的转储有一些奇怪的东西:clr.dll和coreclr.dll都被加载到里面过程..

因此,使用WinDBG中的正确版本的SOS(我的Azure VM上的dotnet核心sdk安装路径中的那个),在运行时会显示以下错误!dumpheap:

0:000> !dumpheap
Error requesting GC Heap data
Unable to build snapshot of the garbage collector state

我尝试在本地发布我的App Service,作为自包含或依赖于框架,并运行已发布的二进制文件。由于我的项目以.NET Core 2.1为目标,因此在此过程中只加载了.NET Core Runtime(coreclr.dll)。

一旦部署到Azure,二进制文件就由IIS运行,使用w3wp进程。此过程是否在我的应用服务中注入了一些需要.NET Framework的依赖项? 为什么我在Azure上运行的.NET Core 2.1应用程序与.NET Framework有一些依赖关系?

分析转储文件(使用ClrMD)时,内部存在两个运行时:

  • .NET Core(mscordaccore_X86_X86_4.6.26212.01.dll)
  • .NET Framework(mscordacwks_X86_X86_4.7.2563.00.dll)

经过测试的方案(不起作用):

  • 使用WinDBG v10(来自Win10 SDK)在Azure上打开依赖于框架的已部署应用程序的32位转储
  • 使用WinDBG Preview v1.0.1805.17002在Azure上打开依赖于框架的已部署应用程序的32位转储
  • 使用WinDGB预览版v1.0.1805.17002在Azure上打开64位转储自包含deluyed应用程序(来自Win10 SDK)

什么工作(差不多):

  • DebugDiag可以分析转储并显示有关堆的一些信息(因此它能够以某种方式读取它)
  • 我设法使用自定义C#代码读取ClrMD的转储,但是当我浏览堆时,并不是所有对象都存在(当我手动浏览堆时,DebugDiag显示的某些对象不可见)。

然而,我需要能够使用WinDGB读取转储以找到潜在的内存泄漏。我工作了几个小时,无法找到任何解决方案。

任何帮助将不胜感激! :)

1 个答案:

答案 0 :(得分:5)

发生了类似的问题,并通过运行以下命令解决了该问题。

您是正确的,因为windbg使用的是错误的CLR(与非net core应用程序相同)。您可以通过运行命令 .cordll 并查看运行时文件使用的路径来证明这一点。

告诉调试器要使用哪个dotnet运行时

.cordll -I coreclr -lp“ D:\ Program Files(x86)\ dotnet \ shared \ Microsoft.NETCore.App \ 2.1.1”

卸载和重新加载CLR调试模块

.cordll -ve -u -I coreclr -l <​​/ strong>