Iis 如何使用WinDBG和SOS调试进程内托管的ASP.Net核心应用程序?
我有一个ASP.NETCore2.2应用程序,目标是.NETCore2.2。我在Azure应用程序服务上使用新的。 然后我通过应用服务诊断工具创建内存转储。使用VisualStudio打开它,我看到两个CLR版本:4.7.3190.0;4.6.27110.4. 我可以看出4.7.3190.0适用于.Net框架,4.6.27110.4适用于.Net核心。 如果我在WinDBG中打开转储,它将继续加载4.7.3190.0的mscordacwks DLL。我没有办法让它加载4.6.27110.4的mscordacore DLL。因此,一个简单的SOS命令,如Iis 如何使用WinDBG和SOS调试进程内托管的ASP.Net核心应用程序?,iis,asp.net-core,windbg,azure-web-app-service,Iis,Asp.net Core,Windbg,Azure Web App Service,我有一个ASP.NETCore2.2应用程序,目标是.NETCore2.2。我在Azure应用程序服务上使用新的。 然后我通过应用服务诊断工具创建内存转储。使用VisualStudio打开它,我看到两个CLR版本:4.7.3190.0;4.6.27110.4. 我可以看出4.7.3190.0适用于.Net框架,4.6.27110.4适用于.Net核心。 如果我在WinDBG中打开转储,它将继续加载4.7.3190.0的mscordacwks DLL。我没有办法让它加载4.6.27110.4的ms
!线程
导致错误请求线程存储失败
如何使用WinDBG和SOS调试托管代码(.Net核心部分)
您可以获得示例内存转储
更新
谢谢你的大力帮助!这种情况的解决方案是运行.cordell-u-I coreclr-l-lp“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\”
。我必须在一个命令中卸载(-u
)CLR DAC并加载(-l
)核心CLR DAC
成功的命令和日志是。一般来说,我会说,看看这个命令。具体来说,
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核心DAC
在崩溃转储中,有两个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
正如VisualStudio所示
如果您执行常规的.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软件包,则在路径中会有一些SOS版本,如C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\
。然后可以从该路径显式加载扩展:
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。您应该为应用程序服务禁用ASP.NET 4.x,以消除.NET Framework噪音。NET Core调试应该遵循@LexLi:你能教我如何为我的应用程序服务禁用ASP.NET 4.x吗?我只能在门户中选择3.5和4.7,但无法禁用它。谢谢。但是你能分享一下关于.cordell-u-l-lp
的模式细节吗?我运行了.cordell-u-l-lp“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0”
,得到了CLR DLL状态:加载的DLL C:\ProgramData\Dbg\sym\mscordacwks\u AMD64\u AMD64\u AMD64\u 4.7.3190.00.DLL\5B693B489ed000\mscordacwks\u AMD64\u 4.7.3190.00.DLL
。和!线程
仍然返回请求线程存储失败
。谢谢,但它仍然不起作用。以下是控制台日志0:000>.unload
卸载MexOMStub扩展DLL
0:000>.cordell-u-l-lp“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0”
CLR DLL状态:加载的DLL C:\ProgramData\Dbg\sym\mscordacwks\U AMD64\U AMD64\U 4.7.3190.00.DLL\5B693B489ed000\mscordacwks\U AMD64\U 4.7.3190.00.DLL
似乎新的WinDbg(引擎版本10.0.18309.1000)继续加载mscordacwks\u AMD64\u AMD64\u 4.7.3190.00.dll
。我已将的输出放入.chain
。即使在我显式运行。unload MexOMStub
。unload DbgEngCoreDMExt之后,卸载C:\ProgramData\Dbg\sym\SOS\u AMD64\u AMD64\u 4.7.3190.00.dll\5B693B489ed000\SOS\u AMD64\u AMD64\u 4.7.3190.00.dll
和。加载C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.0\SOS.dll
,。chain
返回,.cordell
仍然返回CLR DLL状态:加载的DLL C:\ProgramData\Dbg\sym\mscordacwks\U AMD64\U AMD64\U 4.7.3190.00.DLL\5B693B489ed000\mscordacwks\U AMD64\U AMD64\U 4.7.3190.00.DLL
。