.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