20211220 更新:利用VS或者命令內存分析
20210421更新:可以使用https://memprofiler.com/download和VS直接打開dmp文件 (內存泄漏查看比較方便,但是cpu線程分析還是用dotnet-dump analyze好一點)
20201211更新: 用 https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-dump 更方便 後續新出的分析工具 命令差不多(sos.dll: https://docs.microsoft.com/en-us/dotnet/framework/tools/sos-dll-sos-debugging-extension)
服務器上如果出現cpu內存飽滿,找不到原因,那麼dump文件分析必不可少。
起初是想在linux下調試.net core 的dump,但是環境一直無法安裝 搞了許久沒搞出來,其次文章太少了,google幾頁都變紫色了,園友大佬知道可以給小弟解惑下幾個問題。
Linux分析高版本的.net core必須是要lldb3.9.0 這個就很煩了。我的linux的centos7.4。沒有現成的可以下載,只能自己編譯。編譯數小時最終發現並沒有安裝成功,大佬們有沒有腳本能直接安裝lldb3.9.0。開始都是按照https:文章來,結果失敗了,沒有報錯。也感謝這個博主幫助瞭解決不少問題。
.net core console可以創建dump文件,但是asp.net core 無法創建dump文件,官方issue:https://github.com/dotnet/coreclr/issues/21484。 官方解決後,合併到了release 2.2. 也就是説我自己還要編譯corelcr。而這個coreclr編譯也需要特定版本基本也是3.9.0 https://github.com/dotnet/coreclr/blob/master/Documentation/building/linux-instructions.md 。
Windows下.net core dump分析
- 下載工具windbg 地址:https://www.microsoft.com/zh-cn/p/windbg-preview/9pgjgd53tn86?SilentAuth=1&rtc=1&activetab=pivot:overviewtab
- Dump文件:任務管理;選擇w3wp.exe;右鍵;創建轉儲文件 這裏項目用core的一個console項目舉例 代碼如下
- 用windbg打開dump文件
- 加載.net core版的sos擴展插件。輸入:.load C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.2.1\sos注意:framework和.net core都有提供相應版本的sos.dll,在load加載到windbg的時候請選擇正確的地址,這裏加載進去時2.2.1版本。插件介紹:https://docs.microsoft.com/en-us/dotnet/framework/tools/sos-dll-sos-debugging-extension
- 加載完畢使用!help 查看是否加載成功,並查看命令介紹
- 查找線程 !threads
- 指定線程 ~{線程編號}s 例如22號線程:~22s 。 查找該線程的堆棧信息 !clrstack
- 利用!dumpheap 查找所有gc中所有的對象佔用內存的大小並且排序。 (可以利用!help dumpheap 查看相關介紹)
- 利用 !dumpheap -min 85000 查看LOH對象來判斷內存泄漏的對象 LOH 對象介紹:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/large-object-heap這裏測試項目沒有該對象
- 利用!dumpheap -strings 來查看指定對象在應用中的使用 這裏用string 舉例
- 利用!dumpheap -type Console 查看指定類型 在應用中的使用 這裏用console舉例
- 利用!do {線程編號}來查看該改對象在這個線程中的使用