继续写点基础的东西,因为基础的东西能带新手入门,入门后的事情其实是比较简单的。
我们开发dotnet程序后运行时经常出问题,比如cpu高、内存高、崩溃等问题,分析的方法就是使用dotnet的那套分析工具,今天以dotnet-dump为例,简单说下从安装到收集的操作步骤。
1.安装SDK
dotnet分析工具需要dotnet sdk环境,所以需要先安装sdk,以docker下Debian系统为例。参考地址是这个:
https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-debian?tabs=dotnet10
- 先安装wget
apt update
apt install wget
- 再添加包存储库,我删除了sudo,搜索也需要先安装sudo命令
wget https://packages.microsoft.com/config/debian/13/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
- 安装sdk,下面代码是sdk10的,如果需要其他版本直接改版本号就行
sudo apt-get update && \sudo apt-get install -y dotnet-sdk-10.0
2.安装dotnet-dump和收集dump
参考文档
https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-dump#dotnet-dump-analyze
dotnet tool install --global dotnet-dump
现在找到要dump的dotnet进程id,如果在docker里只运行一个dotnet程序,那么这个id一般都是1,也可以先ps命令找下。
dotnet-dump ps
dotnet-dump collect -p 1
这个collect就是收集,它根据dotnet进程内存大小需要一些时间,完成后就会提示收集的dump文件路径,等会就用analyze命令分析它,今天不是主要讲怎么分析,所以略过。
3.崩溃自动收集dump
参考文档
https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/collect-dumps-crash
这个的目的就是当dotnet程序因为一些无法继续的异常发生时,如堆栈溢出、未捕获的异常等会导致程序崩溃(结束进程,有守护进程会重新启动一个新的),自动收集dump,以便分析程序崩溃的原因。
这个非常简单,主要就时加一个环境变量
DOTNET_DbgEnableMiniDump=1
还有个环境变量也很重要,就是DOTNET_EnableCrashReport=1,它会使得在崩溃收集dump时还生成一个json,存储所有线程的信息(大部分时堆栈),里面有个关键的信息就是"crash":"true",它表示这个线程是引起崩溃的线程,崩溃的情况下,这个json里肯定有个线程是带"crash":"true"的,其他线程都是"crash":"false",所以在这个json里搜索这个就很快定位的引起崩溃的线程,以便在dump文件中快速定位问题原因。
用这个办法,我在工作中找到了很多次问题,有时还是线上环境的问题,都是写的代码错误导致,非常有用。
完。