轉儲收集和分析實用工具 (dotnet-dump) ——(microsoft介紹)
阿新 • • 發佈:2021-01-12
原文地址:
https://docs.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-dump
本文適用於: ✔️ .NET Core 3.0 SDK 及更高版本
備註
macOS 的dotnet-dump
僅在 .NET 5.0 及更高版本中受支援。
描述
dotnet-dump
全域性工具是在未涉及任何本機偵錯程式(如 Linux 上的lldb
)的情況下收集和分析 Windows 和 Linux 轉儲的方法。在lldb
無法正常執行的平臺(如 Alpine Linux)上,此工具非常重要。藉助dotnet-dump
工具,可以執行 SOS 命令來分析崩潰和垃圾回收器 (GC),但它不是本機偵錯程式,因此不支援顯示本機堆疊幀之類的操作。
dotnet-dump collect
從程序捕獲轉儲。
dotnet-dump analyze
啟動互動式 shell 以瞭解轉儲。shell 接受各種SOS 命令。
命令 | 函式 |
---|---|
soshelp |
顯示所有可用命令 |
soshelp|help <command> |
執行指定的命令。 |
exit|quit |
退出互動模式。 |
clrstack <arguments> |
僅提供託管程式碼的堆疊跟蹤。 |
clrthreads <arguments> |
列出正在執行的託管執行緒。 |
dumpasync <arguments> |
顯示有關垃圾回收堆上非同步狀態機的資訊。 |
dumpassembly <arguments> |
顯示有關程式集的詳細資訊。 |
dumpclass <arguments> |
顯示有關指定地址處的 EE 類結構的資訊。 |
dumpdelegate <arguments> |
顯示有關委託的資訊。 |
dumpdomain <arguments> |
顯示所有 AppDomain 和域中的所有程式集的資訊。 |
dumpheap <arguments> |
顯示有關垃圾回收堆的資訊和有關物件的收集統計資訊。 |
dumpil <arguments> |
顯示與託管方法關聯的 Microsoft 中間語言 (MSIL)。 |
dumplog <arguments> |
將記憶體中壓力日誌的內容寫入到指定檔案。 |
dumpmd <arguments> |
顯示有關指定地址處的 MethodDesc 結構的資訊。 |
dumpmodule <arguments> |
顯示有關指定地址處的 EE 模組結構的資訊。 |
dumpmt <arguments> |
顯示有關指定地址處的方法表的資訊。 |
dumpobj <arguments> |
顯示有關指定地址處的物件的資訊。 |
dso|dumpstackobjects <arguments> |
顯示在當前堆疊的邊界內找到的所有託管物件。 |
eeheap <arguments> |
顯示有關內部執行時資料結構所使用的程序記憶體的資訊。 |
finalizequeue <arguments> |
顯示所有已進行終結註冊的物件。 |
gcroot <arguments> |
顯示有關對指定地址處的物件的引用(或根)的資訊。 |
gcwhere <arguments> |
顯示傳入引數在 GC 堆中的位置。 |
ip2md <arguments> |
顯示 JIT 程式碼中指定地址處的 MethodDesc 結構。 |
histclear <arguments> |
釋放由hist* 命令系列使用的任何資源。 |
histinit <arguments> |
從儲存在除錯物件中的壓力日誌初始化 SOS 結構。 |
histobj <arguments> |
顯示與<arguments> 相關的垃圾回收壓力日誌重定位。 |
histobjfind <arguments> |
顯示在指定地址處引用物件的所有日誌項。 |
histroot <arguments> |
顯示與指定根的提升和重定位相關的資訊。 |
lm|modules |
顯示程序中的本機模組。 |
name2ee <arguments> |
顯示<argument> 的 MethodTable 結構和 EEClass 結構。 |
pe|printexception <arguments> |
顯示從地址<argument> 處的 Exception 類派生的任何物件。 |
setsymbolserver <arguments> |
啟用符號伺服器支援 |
syncblk <arguments> |
顯示 SyncBlock 持有者資訊。 |
threads|setthread <threadid> |
設定或顯示 SOS 命令的當前執行緒 ID。 |
使用dotnet-dump
第一步是收集轉儲。如果已生成核心轉儲,則可以跳過此步驟。作業系統或 .NET Core 執行時的內建轉儲生成功能均可以建立核心轉儲。
控制檯$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete
現在,使用analyze
命令分析核心轉儲:
$ dotnet-dump analyze ./core_20190226_135850
Loading core dump: ./core_20190226_135850
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>
此操作會顯示一個互動式會話,該會話接受以下類似命令:
控制檯> clrstack
OS Thread Id: 0x573d (0)
Child SP IP Call Site
00007FFD28B42C58 00007fb22c1a8ed9 [HelperMethodFrame_PROTECTOBJ: 00007ffd28b42c58] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[]) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
00007FFD28B43210 00007fb22aa9cedf [GCFrame: 00007ffd28b43210]
00007FFD28B43610 00007fb22aa9cedf [GCFrame: 00007ffd28b43610]
檢視已終止應用的未經處理的異常:
控制檯> pe -lines
Exception object: 00007fb18c038590
Exception type: System.Reflection.TargetInvocationException
Message: Exception has been thrown by the target of an invocation.
InnerException: System.Exception, Use !PrintException 00007FB18C038368 to see more.
StackTrace (generated):
SP IP Function
00007FFD28B42DD0 0000000000000000 System.Private.CoreLib.dll!System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+0xa7 [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.dll!SymbolTestApp.Program.Foo2(Int32, System.String)+0x34 [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.dll!SymbolTestApp.Program.Foo1(Int32, System.String)+0x3a [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.dll!SymbolTestApp.Program.Main(System.String[])+0x6e [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
StackTraceString: <none>
HResult: 80131604
Docker 的特殊說明
如果在 Docker 下執行,則轉儲集合需要SYS_PTRACE
功能(--cap-add=SYS_PTRACE
或--privileged
)。
在 Microsoft .NET Core SDK Linux Docker 映像上,某些dotnet-dump
命令可能會引發以下異常:
未經處理的異常:System.DllNotFoundException:無法載入共享庫“libdl.so”或其依賴項之一的異常。
若要解決此問題,請安裝“libc6-dev”包。