.NET Core 诊断全局工具
dotnet-counters
dotnet-counters 是一个性能监视工具,用于初级运行状况监视和性能调查。 它通过 EventCounter API 观察已发布的性能计数器值。 例如,可以快速监视 CPU 使用情况或 .NET Core 应用程序中的异常率等指标。
dotnet-dump
通过 dotnet-dump 工具,可在不使用本机调试器的情况下收集和分析 Windows 和 Linux 核心转储。
dotnet-gcdump
dotnet-gcdump 工具可用于为活动 .NET 进程收集 GC(垃圾回收器)转储。
dotnet-trace
分析数据通过 .NET Core 中的 EventPipe
公开。 通过 dotnet-trace 工具,可以使用来自应用的有意思的分析数据,这些数据可帮助你分析应用运行缓慢的根本原因。
dotnet-stack
使用 dotnet-stack 工具可以快速打印正在运行的 .NET 进程中的所有线程的托管堆栈。
dotnet-symbol
dotnet-symbol 用于下载打开核心转储或小型转储所需的文件(符号、DAC/DBI、主机文件等)。 如果需要使用符号和模块来调试在其他计算机上捕获的转储文件,请使用此工具。
dotnet-sos
dotnet-sos 在 Linux 和 macOS(如果使用的是 Windbg/cdb,则在 Windows 上)安装 SOS调试扩展。
PerfCollect
PerfCollect 是一个 bash 脚本,可用于收集包含 perf
和 LTTng
的跟踪,以便更深入地分析在 Linux 分发版上运行的 .NET 应用的性能。
dotnet-dump
生成Dump
Windows
Docker
docker exec -it dockername /bin/bash
find /usr/share -name createdump
/usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.0/createdump 1
docker cp dockername:/tmp/coredump.1 ./
如果出现以下信息:
Writing minidump with heap to file /tmp/coredump.1 ptrace(ATTACH, 1) FAILED Operation not permitted
说明没有权限,需要在docker run的时候带上命令 --privileged=true
获取到root权限
dotnet-dump
#安装dotnet-dump
dotnet tool install --global dotnet-dump
# 10504 是进程ID
dotnet-dump collect -p 10504 -o 20221228.dump
procdump
#ma参数后面接进程名称或ID
procdump -ma ConsoleApp2 -o F:\Download
procdump -ma ConsoleApp2 -o F:\Download
procdump -ma 4572 F:\Download
#设置 procdump 在内存超过 1G 的时候自动抓取全内存 dump
procdump -m 1024 -ma ConsoleApp2 -o F:\Download
分析Dump
dotnet-dump
参考文档:
- https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-dump
- https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/sos-debugging-extension
- https://www.cnblogs.com/huangxincheng/p/14661031.html
- https://www.cnblogs.com/wu_u/p/14109333.html
dotnet-dump analyze
语法:
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
- dump_path:指定要分析的转储文件的路径
- -c <debug_command>:指定要在启动时在 shell 中运行的命令
#查询的数据列表是 数量和字节数
dotnet-dump analyze 20221228.dump #使用 dotnet-dump 工具分析转储
dotnet-dump analyze coredump2 --command dumpheap -mt 00007f7740950f90 >> F:\op.txt #数量过多写入文本
eeheap -gc #查看gc堆大小
eeheap -loader
dumpheap -stat 或 dg gen2 #查看的是托管堆的整体状态
dumpheap -stat -min 1024 #查看大于1M的数据
dumpheap -mt 00007fceeffd0f90 #使用 dumpheap 命令来获取所有 String 实例的列表
dumpheap -mt 00007f77464439e0 0 00007f71302cdd60 #最后一个参数是指其中的一个数据,代表找到此数据后停止往下搜索
dumpheap -mt 00007f15c4d914c0 -min 1024
do 00007f7740950f90 #显示有关指定地址处的对象的信息
gcroot 00007f718a8dcd78 #查看对象引用链
gcroot -all 00007f5481592d58 #查看对象所有引用链
clrstack 00007f718a8dcd78 #列出正在运行的托管线程
clrstack -all 00007f718a8dcd78
clrthreads #仅提供托管代码的堆栈跟踪
gcwhere 00007f718a8dcd78 #显示传入参数在 GC 堆中的位置。
dso 00007f718a8dcd78 #显示在当前堆栈的边界内找到的所有托管对象
objsize 00007f71302b6408 #查看对象大小。选择gcroot HandleTable下的对象
与dotnet-sos
配合使用
sos DumpStackObjects 00007f718a8dcd78
dotnet-gcdump
简介
dotnet-gcdump
适用于 3.1.57502 版本及更高版本
dotnet-gcdump
工具可用于为活动 .NET 进程收集 GC(垃圾回收器)转储。
dotnet-gcdump
全局工具使用 EventPipe 收集实时 .NET 进程的 GC(垃圾回收器)转储。创建 GC 转储时需要在目标进程中触发 GC、开启特殊事件并从事件流中重新生成对象根图。此过程允许在进程运行时以最小的开销收集 GC 转储。
这些转储对于以下几种情况非常有用:
- 比较多个时间点堆上的对象数。
- 分析对象的根(回答诸如“还有哪些引用此类型的内容?”等问题)。
- 收集有关堆上的对象计数的常规统计信息。
生成GCDump
#安装dotnet-gcdump
dotnet tool install --global dotnet-gcdump
gcdump collect
语法:
-p
指定应用程序进程-o
指定 gcdump 文件输出路径,默认为.YYYYMMDD_HHMMSS_<pid>.gcdump
文件-v
传入 true 或 false 默认为 false 如果传入 true 将会输出更多调试信息-t
超时时间,单位是秒,默认是30秒
生成gcdump
,1是进程ID
dotnet-gcdump collect -p 1
dotnet-gcdump collect -p 1 -o f:/net_20221227.gcdump
列出可收集 GC 转储的 dotnet 进程
dotnet-gcdump ps
查看堆栈报告
- 使用 Visual Studio打开生成的GC文件查看报告
dotnet-gcdump report
查看
#通过GC文件生成
dotnet-gcdump report 20221227.gcdump
#通过进程ID生成
dotnet-gcdump report -p 1