dotnet-*工具的正確使用姿勢


安裝

    • 因為我們現在都是容器化時代了,所以我們可以把這類工具全部制作成基礎鏡像
    • 准備Dockerfile
  1 FROM mcr.microsoft.com/dotnet/sdk:3.1 AS sdk
  2 RUN dotnet tool install --tool-path /tools dotnet-trace
  3 RUN dotnet tool install --tool-path /tools dotnet-counters
  4 RUN dotnet tool install --tool-path /tools dotnet-dump
  5 RUN dotnet tool install --tool-path /tools dotnet-gcdump
  6 
  7 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
  8 WORKDIR /tools
  9 COPY --from=sdk /tools .
 10 
 11 
basedockerfile.yaml

驗證

  • 基礎鏡像做好了,查看下鏡像的大小應該就比runtime的大小多幾十兆,相比為了使用dotnet-* tool而直接采用sdk的話,體積小了很多很多
  • 用我們剛才制作的基礎鏡像隨便起個demo程序驗證下
    • 已經包含了tools文件夾了,里面存放了我們的tools工具
    • image
    • image
    • 以dotnet-trace為例,測試下是否可用(ps:注意使用方式)
    • image
  • 至此包含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)
    • image
    • 他會將coredump文件生成到容器的tmp目錄下,至此沒報錯的話,說明成功
    • 如果報權限相關錯誤,可以在你的yaml文件里加上:
      • image

分析coredump文件

  • 先將上面生成在tmp下的coredump文件copy到可以調試的地方
  • kubectl cp  bookstore/demo-7b6d9f6d4f-2t8hl:/tmp/coredump.1 /root/mydump/coredump.1 -c app-k8s
  • image
  • 然后為我們的coredump.1文件下載關聯的symbol:
    • 如果你准備分析dump的機器沒有dotnet sdk的話,先裝一個把
    • 如果dotnet-symbol沒有安裝的話,安裝一個
      • dotnet tool install --global dotnet-symbol
      • 然后關閉當前終端,再打開一個新的
    • 然后執行dotnet-symbol --host-only --debugging coredump.1
      • image
      • 看到dac,dbi文件寫入就代表成功了,這時候你的文件夾應該長這樣
        • image
    • 然后我們使用lldb進行調試
      • 如果你機器里沒裝的話,先裝一個吧
      • 安裝sos插件:
        • dotnet tool install --global dotnet-sos
        • dotnet-sos install
      • lldb-8 --core coredump.1
      • 然后就可以用lldb來分析dump文件了

相關資料:

  1. https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-symbol
  2. https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md#getting-symbols
  3. https://devblogs.microsoft.com/devops/understanding-symbol-files-and-visual-studios-symbol-settings/
  4. https://github.com/dotnet/diagnostics/blob/master/documentation/FAQ.md
  5. https://github.com/dotnet/runtime/issues/11012
  6. 關於大對象使用的注意點以及官方blob gc的實現描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM