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

Jer*_*ent 3 .net windbg sos azure .net-core

我在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
Run Code Online (Sandbox Code Playgroud)

我试图以独立或依赖框架的形式在本地发布我的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 Preview v1.0.1805.17002在Azure上从Win10 SDK打开自包含的Depoy应用程序的64位转储

什么工作(几乎):

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

但是,我需要能够使用WinDGB读取转储,以发现潜在的内存泄漏。我已经花了好几个小时来研究它,却找不到任何解决方案。

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

dnn*_*per 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