1.首先要先准備好環境,安裝lldb 工具 要安裝3.9版本的,因為每個版本對應dnc版本不一樣,3.9的支持2.2 版本,然后確定分析的機器里dnc 版本和線上的生產環境是否一致,自己安裝比較費勁,可以使用一些已經安裝好的docker鏡像來進行分析更簡單一點
2.在生產環境生成dump文件可以使用procdump 工具或者直接使用dotnet 自帶的工具
/usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/createdump 9364(線程id)
3.首先使用linux 命令查詢占用cpu高的線程
top -H 命令查詢
4.在本地開始分析
1>lldb 加載文件
lldb dotnet \
-c /opt/dump\_file/mvcdumpmindump \
-o "plugin load /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/libsosplugin.so"
2>設置dotent core 運行環境 setclrpath /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.1/命令
3>clrthreads -live 列出所有線程
4>thread select 11(線程編號)
5>clrstack -p 查看代碼堆棧信息
最后定位到了一段代碼,其中有while循環,代碼如下:
這一段代碼猛一看好像沒有問題,也會出現死循環的情況,那么情況是怎么產生的呢?經過和同事一起慢慢的重現出來了,因為有重復新聞id的產生造成了死循環,最終代碼修好后問題解決!!