正確使用dotnet-*工具的方法
安裝
- 因為我們現在都是容器化時代瞭,所以我們可以把這類工具全部制作成基礎鏡像
- 準備Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS sdk RUN dotnet tool install --tool-path /tools dotnet-trace RUN dotnet tool install --tool-path /tools dotnet-counters RUN dotnet tool install --tool-path /tools dotnet-dump RUN dotnet tool install --tool-path /tools dotnet-gcdump FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime WORKDIR /tools COPY --from=sdk /tools . basedockerfile.yaml
驗證
基礎鏡像做好瞭,查看下鏡像的大小應該就比runtime的大小多幾十兆,相比為瞭使用dotnet-* tool而直接采用sdk的話,體積小瞭很多很多
用我們剛才制作的基礎鏡像隨便起個demo程序驗證下
- 已經包含瞭tools文件夾瞭,裡面存放瞭我們的tools工具
- 以dotnet-trace為例,測試下是否可用(ps:註意使用方式)
至此包含tools的runtime基礎鏡像制作完畢。
dotnet-dump
它隻能收集托管內存,不能用於條是本地代碼的問題,而且分析它所創建的dump文件,必須和當前環境保持一致
createdump
它既可以收集本地信息又可以收集托管信息,是一種比較全面而且推薦的方法
雖然gdb、gcore也能起到同樣的作用,但是他們可能會在收集的時候錯過一些托管狀態,導致最後你分析dump文件的時候有”UNKNOWN“的錯誤
這個工具是伴隨著.net core runtime安裝的,目錄一般在”/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]“下
開始使用:
- /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/createdump -u 1 (1是我容器中程序的進程id)
- 他會將coredump文件生成到容器的tmp目錄下,至此沒報錯的話,說明成功
- 如果報權限相關錯誤,可以在你的yaml文件裡加上:
分析coredump文件
先將上面生成在tmp下的coredump文件copy到可以調試的地方
kubectl cp bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
然後為我們的coredump.1文件下載關聯的symbol:
如果你準備分析dump的機器沒有dotnet sdk的話,先裝一個把
- sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
- sudo yum install dotnet-sdk-3.1
如果dotnet-symbol沒有安裝的話,安裝一個
- dotnet tool install –global dotnet-symbol
- 然後關閉當前終端,再打開一個新的
然後執行dotnet-symbol –host-only –debugging coredump.1
- 看到dac,dbi文件寫入就代表成功瞭,這時候你的文件夾應該長這樣
然後我們使用lldb進行調試
- 如果你機器裡沒裝的話,先裝一個吧
- 安裝sos插件:
- dotnet tool install –global dotnet-sos
- dotnet-sos install
- lldb-8 –core coredump.1
- 然後就可以用lldb來分析dump文件瞭
相關資料:
- https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol
- https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md
- https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/
- https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
- https://github.com/dotnet/runtime/issues/11012
- 關於大對象使用的註意點以及官方blob gc的實現描述
以上所述是小編給大傢介紹的正確使用dotnet-*工具的方法,希望對大傢有所幫助。在此也非常感謝大傢對WalkonNet網站的支持!
推薦閱讀:
- 教你創建一個帶診斷工具的.NET鏡像
- .NET 6 中的 dotnet monitor詳細解析
- .NET 6中的dotnet monitor講解
- 使用.NET Core創建exe應用程序
- 在Linux+Jexus中發佈和部署Asp.Net Core