如何使用WinDBG和SOS调试进程内托管的ASP.Net Core应用?

时间:2019-01-03 11:36:59

标签: iis asp.net-core windbg azure-web-app-service

我有一个针对.Net Core 2.2的ASP.Net Core 2.2应用程序。我使用新的in-process hosting model将其托管在Azure App Service上。 然后,我通过App Service诊断工具创建内存转储。使用Visual Studio打开它,我看到两个CLR版本:4.7.3190.0; 4.6.27110.4。我可以说4.7.3190.0适用于.Net Framework,而4.6.27110.4适用于.Net Core。 enter image description here 如果在WinDBG中打开转储,它将继续加载4.7.3190.0的mscordacwks DLL。我无法使其加载4.6.27110.4的mscordaccore DLL。因此,简单的SOS命令(例如!Threads会导致错误Failed to request ThreadStore

如何使用WinDBG和SOS调试托管代码(.Net Core部分)?

您可以获得示例内存转储here

更新

感谢Thomas Weller的大力帮助!解决此问题的方法是运行.cordll -u -I coreclr -l -lp "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\"。我必须卸载(-u)CLR DAC并通过一条命令加载(-l Core CLR DAC。

成功的命令和日志为here

1 个答案:

答案 0 :(得分:1)

一般来说,我想看看.cordll命令。具体来说,

0:000> .cordll -u
CLR DLL status: No load attempts

卸载CLR DAC和

0:000> .cordll -I coreclr -l -lp "C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\"
CLR DLL status: Loaded DLL f:\debug\symbols\mscordaccore_AMD64_AMD64_4.6.27110.04.dll\5BE756335c6000\mscordaccore_AMD64_AMD64_4.6.27110.04.dll

从特定路径加载.NET Core DAC。


您的崩溃转储中有2个CLR版本:

0:000> lm m *clr
start             end                 module name
00007ffc`ac990000 00007ffc`acf56000   coreclr    (deferred)             
00007ffc`c2130000 00007ffc`c2b1d000   clr        (deferred)

详细信息是

0:000> lmvm clr
[...]
    File version:     4.7.3190.0
0:000> lmvm coreclr
[...]
    File version:     4.6.27110.4

就像Visual Studio所示。

如果执行常规的.loadby sos clr,它将从clr所在的位置加载4.7版本的SOS。不幸的是,.loadby sos coreclr不能以相同的方式工作,因为对.NET Core的调试支持没有以与.NET相同的方式提供。

0:000> .loadby sos coreclr
The call to LoadLibrary(D:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\sos) failed
Win32 error 0n126 "The specified module could not be found."

如果已安装匹配的.NET Core软件包,则在C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\之类的路径中有一些SOS版本。然后,您可以从该路径显式加载扩展名:

0:000> .load C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\sos.dll

确保卸载CLR的SOS:

0:000> .unload C:\...\sos.dll

然后用.chain检查是否仅加载了一个SOS。