WinDbg Preview简单使用
CLR程序调试入门
程序不光要能跑,还要能一直稳定的跑。前段时间线上接口时不时就会整体Down一下,性能非常不稳定,通过多方摸索,尝试才找到原因。不从细节直接入手,出现问题就会手忙脚乱,不能在短时间内解决。
dump包的抓取
Windows
直接在任务管理器里面,选中对应的进程,右键->创建转储文件 即可。
Linux
首先需要安装抓取dump的工具:
dotnet tool install -g dotnet-dump
然后找到需要抓取dump包的进程的,NetCore程序可以通过一下命令查看(dotnet可以修改程启动进程的命令,模糊匹配):
ps -aux |grep dotnet
使用安装的工具dotnet-dump即可抓取对应进程的dump:
dotnet-dump collect --process-id <PID>
基本dump包分析
安装Windbg Preview,可以直接在Windows的应用商店Microsoft Store搜索WinDbg,然后直接安装即可。
安装完毕打开如图:
配置微软公有符号,配置路径如下,路径填写SRV*C:\mysymbols*http://msdl.microsoft.com/download/symbols 即可
点击文件,然后点击下图框出来的地方,选择抓取的dump文件,即可进行分析。
打开之后,进入到如下命令行页面,会展示一些dump包基本的信息,以及提示,可以通过 !analyze -v 进行进一步的分析。
调试器命令可以参照微软官方文档调试命令
SOS 调试扩展
获取对应的clr.dll以及sos.dll
想要获取进一步的分析,就需要加载coreclr.dll(clr.dll–framework程序)以及sos.dll进行进一步的分析。
由于不通版本的程序coreclr.dll(clr.dll)以及sos.dll不一样,所以每次分析的时候,需要根据抓取dump包的程序的目标框架,选择不同的版本。
首先,可以通过一下命令查看到对应的coreclr.dll版本,然后通过下面的方法找到对应的coreclr以及sos。
lmv -mcoreclr
framework的路径如下,路径里面第一层是机器位数,第二层是framework对应的版本,第三层就可以找到对应的clr.dll以及sos.dll:
C:\Windows\Microsoft.NET
netcore下的coreclr.dll以及sos.dll就比较复杂,NetCore的路径如下,路径下第一层即dotnet对应的版本,第二层可以直接找到对应的coreclr.dll:
C:\Program Files\dotnet\shared\Microsoft.NETCore.App
但是sos.dll不一定能找到,NetCore3.0之前,可以直接找到,但是NetCore3.0之后,Sos.dll不会直接放在该文件夹下。不过里面有个SOS_README.md,内容如下:
SOS and other diagnostic tools now ship of band and work with any version of the .NET Core runtime.
SOS has moved to the diagnostics repo here: https://github.com/dotnet/diagnostics.git.
Instructions to install SOS: https://github.com/dotnet/diagnostics#installing-sos.
打开对应的github地址,找到如下地址https://github.com/dotnet/diagnostics/blob/main/documentation/sos.md,可以找到sos的安装方法。
Windows的安装方法如下【windows安装Sos】:
先安装对应的工具dotnet-sos,命令如下:
dotnet tool install -g dotnet-sos
然后执行dotnet-sos的安装命令:
dotnet-sos install
即可获取到对应的sos.dll,路径为:
C:\Users\<对应的用户名>\.dotnet\sos
加载基于sos的符号
加载dll,可以通过**.load <dll地址>** :
.load C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.23\sos.dll
.load C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.23\coreclr.dll
加载完成之后,就可以通过 !clrstack -l 查看对应的clr堆栈调用情况。
配置完成之后,也可以使用基于Sos的调试命令。命令帮助可以使用 !SOS.help 查看,也可以参照微软官方文档SOS扩展调试
其他更多调试方法,也可以根据官方文档进行配置。
加载sos异常及处理方法
常见异常及处理方法可以参考一下文档常见异常