无法在 WinDGB 中打开 Azure App Service .NET Core 2 转储文件(转储文件中存在 2 个运行时)
Cannot open Azure App Service .NET Core 2 dump file in WinDGB (2 runtimes present in dump file)
我在 WinDBG 中打开 .NET Core 进程 的转储文件时遇到一些问题。
我曾经使用 WinDBG 调试 .NET 框架转储,没有任何问题,但是来自 Azure App Service 的转储有些奇怪:clr.dll 和核心clr.dll 正在进程内加载..
因此,使用来自 WinDBG 的正确版本的 SOS(来自我的 Azure VM 上的 dotnet core sdk 安装路径的版本),在 运行ning !dumpheap:[=11 时显示以下错误=]
0:000> !dumpheap
Error requesting GC Heap data
Unable to build snapshot of the garbage collector state
我尝试在本地发布我的应用服务,作为独立的或依赖于框架的,以及 运行 发布的二进制文件。在此过程中仅加载了 .NET Core 运行时 (coreclr.dll),因为我的项目以 .NET Core 2.1 为目标。
部署到 Azure 后,二进制文件由 IIS 运行 使用 w3wp 进程。此过程是否在我的应用程序服务中注入了一些需要 .NET Framework 的依赖项? 为什么我在 Azure 上的 .NET Core 2.1 应用 运行ning 对 .NET Framework 有一些依赖性?
分析转储文件(使用ClrMD)时,里面有两个运行次:
- .NET 核心 (mscordaccore_X86_X86_4.6.26212.01.dll)
- .NET 框架 (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(来自 Win10 SDK)上打开独立部署应用程序的 64 位转储
有效的(几乎):
- DebugDiag 可以分析转储并显示有关堆的一些信息(因此它能够以某种方式读取它)
- 我设法使用自定义 C# 代码通过 ClrMD 读取了转储,但当我浏览堆时似乎并非所有对象都存在(当我手动浏览堆时,DebugDiag 显示的某些对象不可见)。
尽管如此,我需要能够使用 WinDGB 读取转储以查找潜在的内存泄漏。我已经处理了几个小时,但找不到任何解决方案。
如有任何帮助,我们将不胜感激! :)
有一个类似的问题并通过 运行 这些命令解决了它。
您是正确的,因为 windbg 使用了错误的 CLR(错的不是网络核心应用程序)。您可以通过 运行 命令 .cordll 并查看运行时文件使用的路径来证明这一点。
告诉调试器使用什么 dotnet 运行时
.cordll -I coreclr -lp "D:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App.1.1"
卸载并重新加载 CLR 调试模块
.cordll -ve -u -I coreclr -l
我在 WinDBG 中打开 .NET Core 进程 的转储文件时遇到一些问题。 我曾经使用 WinDBG 调试 .NET 框架转储,没有任何问题,但是来自 Azure App Service 的转储有些奇怪:clr.dll 和核心clr.dll 正在进程内加载..
因此,使用来自 WinDBG 的正确版本的 SOS(来自我的 Azure VM 上的 dotnet core sdk 安装路径的版本),在 运行ning !dumpheap:[=11 时显示以下错误=]
0:000> !dumpheap
Error requesting GC Heap data
Unable to build snapshot of the garbage collector state
我尝试在本地发布我的应用服务,作为独立的或依赖于框架的,以及 运行 发布的二进制文件。在此过程中仅加载了 .NET Core 运行时 (coreclr.dll),因为我的项目以 .NET Core 2.1 为目标。
部署到 Azure 后,二进制文件由 IIS 运行 使用 w3wp 进程。此过程是否在我的应用程序服务中注入了一些需要 .NET Framework 的依赖项? 为什么我在 Azure 上的 .NET Core 2.1 应用 运行ning 对 .NET Framework 有一些依赖性?
分析转储文件(使用ClrMD)时,里面有两个运行次:
- .NET 核心 (mscordaccore_X86_X86_4.6.26212.01.dll)
- .NET 框架 (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(来自 Win10 SDK)上打开独立部署应用程序的 64 位转储
有效的(几乎):
- DebugDiag 可以分析转储并显示有关堆的一些信息(因此它能够以某种方式读取它)
- 我设法使用自定义 C# 代码通过 ClrMD 读取了转储,但当我浏览堆时似乎并非所有对象都存在(当我手动浏览堆时,DebugDiag 显示的某些对象不可见)。
尽管如此,我需要能够使用 WinDGB 读取转储以查找潜在的内存泄漏。我已经处理了几个小时,但找不到任何解决方案。
如有任何帮助,我们将不胜感激! :)
有一个类似的问题并通过 运行 这些命令解决了它。
您是正确的,因为 windbg 使用了错误的 CLR(错的不是网络核心应用程序)。您可以通过 运行 命令 .cordll 并查看运行时文件使用的路径来证明这一点。
告诉调试器使用什么 dotnet 运行时
.cordll -I coreclr -lp "D:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App.1.1"
卸载并重新加载 CLR 调试模块
.cordll -ve -u -I coreclr -l