在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

 

 

以下定位代码

dotnet core 高CPU定位 dotnet-dump篇_dotnet core

 

 1) centos 7 编译代码并运行 进程号 8936

dotnet core 高CPU定位 dotnet-dump篇_microsoft_02

 

 

2) top -Hp 8936   显示8936进程中 线程8936 CPU 99.3%

 

dotnet core 高CPU定位 dotnet-dump篇_dump_03

 

 4) dotnet-dump collect -p 8936 -o mytest.dump

dotnet core 高CPU定位 dotnet-dump篇_dotnet core_04

 

 5) 分析dump 文件这里windowdbg 类似 dotnet-dump analyze mytest.dump

 

dotnet core 高CPU定位 dotnet-dump篇_microsoft_05

 

 6) dumpdomain --显示所有 AppDomain 和域中的所有程序集的信息  其中dotnet core 和.net framwork 的  AppDomain 有些差别, .net framwork 有3个程序域,dotnetcore 只有2个,少一个共享程序域.

dotnet core 高CPU定位 dotnet-dump篇_dump_06

 

 7)言归正传,看一下成活线程 clrthreads -live   

dotnet core 高CPU定位 dotnet-dump篇_centos_07

 

 8) threads 

dotnet core 高CPU定位 dotnet-dump篇_centos_08

 

 9)setthread 0   #切换8936显程编号 0  并查看

      clrstack -a  #当前线程托管代码的堆栈跟踪

 找出当前线程计算stack情况调用Test2 

dotnet core 高CPU定位 dotnet-dump篇_dotnet core_09

 10) r 也可以进一步看 寄存器执行在做什么(汇编指令),根据linux 内核dumpstack关系深入分析

dotnet core 高CPU定位 dotnet-dump篇_microsoft_10

 

 

当前线程