轉儲收集和分析實用工具 (dotnet-dump) ——(microsoft介紹)


原文地址:

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”包。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM