我有一个针对.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。
如果在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。
答案 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。