博客 / 詳情

返回

dotnet-dump安裝、收集dump和崩潰自動收集dump

繼續寫點基礎的東西,因為基礎的東西能帶新手入門,入門後的事情其實是比較簡單的。

我們開發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文件中快速定位問題原因。
用這套dotnet分析工具,我在工作中找到了很多次問題,有時還是線上環境,有cpu內存高的、有死鎖的、有調用native代碼導致的,都是寫的代碼錯誤導致,非常有用。當然這些都包含公司機密,不方便分享,所以就不能寫出來了,我在博客裏分享的都不會包含公司保密規定的內容,只能分享純技術類的。

完。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.