我的 Azure Web 应用程序内存泄漏。该应用程序运行.NET Core。我正在尝试分析内存转储来测试我关于泄漏的假设。
我使用 Kudu 收集了内存转储 - 我转到
Tools > Support > Metrics > Diagnose
触发转储,然后进入 Diagnostics
选项卡,可以下载原始 .dmp
文件以及 Kudu 从 DebugDiag 自动生成的分析结果。但是,分析结果文件中没有实际结果,并列出了此错误消息:
CLR is loaded in the target, but the correct dac file cannot be found
我还下载了原始
.dmp
文件,并尝试通过本地 DebugDiag 以及 Visual Studio 2015 的内存转储分析器对其进行分析。在所有情况下,我都无法看到任何实际的内存分析。
当我针对另一个应用程序尝试此操作(针对完整的 .NET Framework v4.6 运行)时,DebugDiag 分析有效。所以我怀疑我遇到的问题是因为该应用程序针对 .NET Core 运行。
是否有适用于 .NET Core 的内存转储分析器?或者,是否有技巧可以让 .NET Core 转储与 DebugDiag 的
DotNetMemoryAnalysis
规则一起使用?
根据我的经验,我只能调试其他工具生成的转储,而不能调试 Kudu 的工具。我收集了两个工作选项 (12/2024)
dotnet-dump
和 procdump
:
dotnet-dump
工具是.NET诊断套件的一部分,非常适合分析.NET Core应用程序中的内存转储。它是轻量级的,不需要暂停或终止您的应用程序来收集转储。
步骤:
dotnet tool install --global dotnet-dump
dotnet-dump collect -p <pid>
可以使用 Kudu Process Explorer、任务管理器或
ps
找到进程 ID。
dotnet-dump analyze <path_to_dump>
在分析器内部,像
clrstack -all
这样的命令可以帮助您检查线程的调用堆栈。
procdump
可以根据各种触发器捕获内存转储,例如 CPU 高或手动崩溃。
步骤:
C:\Program Files (x86)\SiteExtensions\DaaS\4.5.24704.1\bin\DiagnosticTools\procdump.exe
procdump.exe -accepteula -ma <pid> -t C:\home\mydump.dmp
使用 Visual Studio 等工具来分析下载的转储。您还可以使用命令
strings
从转储中检索有趣的值。