在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关系深入分析
当前线程