在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关系深入分析

当前线程
浙公网安备 33010602011771号