在windows操作系統,我們可以用Windbg定位,那在linux微軟也提供dotnet-dump定位
准備
# 注冊 Microsoft 密鑰和源
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
# 安裝 .NET Core SDK
yum install dotnet-sdk-3.1
# 驗證是否安裝成功
dotnet --version
dotnet tool install -g dotnet-dump
以下定位代碼
1) centos 7 編譯代碼並運行 進程號 8936
2) top -Hp 8936 顯示8936進程中 線程8936 CPU 99.3%
4) dotnet-dump collect -p 8936 -o mytest.dump
5) 分析dump 文件這里windowdbg 類似 dotnet-dump analyze mytest.dump
6) dumpdomain --顯示所有 AppDomain 和域中的所有程序集的信息 其中dotnet core 和.net framwork 的 AppDomain 有些差別, .net framwork 有3個程序域,dotnetcore 只有2個,少一個共享程序域.
7)言歸正傳,看一下成活線程 clrthreads -live
8) threads
9)setthread 0 #切換8936顯程編號 0 並查看
clrstack -a #當前線程托管代碼的堆棧跟蹤
找出當前線程計算stack情況調用Test2
10) r 也可以進一步看 寄存器執行在做什么(匯編指令),根據linux 內核dumpstack關系深入分析
當前線程