通过


实时进程调试和转储分析实用工具(dotnet-debug)

本文适用于: ✔️ dotnet-debug 版本 0.0.710501 及更高版本

注释

dotnet-debug 目前仅支持基于 CoreCLR 的应用程序,目前在 macOS 上不受支持。

Install

可采用两种方法来下载和安装 dotnet-debug

概要

dotnet-debug [-h|--help] [--version] <command>

Description

使用 dotnet-debug 全局工具,可以附加到实时 .NET 进程并交互式分析转储文件。 与专注于转储收集和脱机分析不同 dotnet-dumpdotnet-debug 它专为实时过程检查而设计。 它支持与 . 相同的 SOS 调试命令dotnet-dump

此工具在 Alpine Linux 等平台上非常有用,其中完全工作 lldb 不可用。 该工具 dotnet-debug 运行 SOS 命令来分析托管状态和堆诊断,但它不是本机调试器,因此不支持显示本机堆栈帧。

选项

  • --version

    显示 dotnet-debug 实用工具的版本。

  • -h|--help

    显示命令行帮助。

指令

Command
dotnet-debug 附加
dotnet-debug open-dump

dotnet-debug 附加

附加到实时进程,并使用调试命令启动交互式 shell 以浏览它。

概要

dotnet-debug attach <process-id> [-c|--commands <debug_command>] [--accept-license-agreement]

Arguments

  • <process-id>

    要附加到和分析的进程 ID。

选项

  • -c|--commands <debug_command>

    在启动时运行命令。 此参数的多个实例可用于调用链接命令。 命令按命令行上提供的顺序运行。 如果要 dotnet-debug 在命令后退出,则最后一个命令应为 exit

  • --accept-license-agreement

    接受许可协议而不提示。

Example

附加到 ID 为 1234 的正在运行的进程:

$ dotnet-debug attach 1234
Attaching to process: 1234 ...
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.
>

在附加上运行命令,然后退出:

dotnet-debug attach 1234 -c clrstack -c exit

dotnet-debug open-dump

使用调试命令启动交互式 shell 以浏览转储文件。

概要

dotnet-debug open-dump <dump_path> [-c|--commands] [--accept-license-agreement]

Arguments

  • <dump_path>

    要分析的转储文件的路径。

选项

  • -c|--commands <debug_command>

    在启动时运行命令。 此参数的多个实例可用于调用链接命令。 命令按命令行上提供的顺序运行。 如果要 dotnet-debug 在命令后退出,则最后一个命令应为 exit

  • --accept-license-agreement

    接受许可协议而不提示。

Example

打开和分析转储文件:

$ dotnet-debug open-dump ./core_20260209_135837
Loading dump: ./core_20260209_135837 ...
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.
>

调试 SOS 命令

命令attachopen-dump都显示一个接受以下 SOS 命令的交互式会话。

Command 功能
analyzeoom 显示对 GC 堆进行分配请求时发生的最后 OOM 的信息。
clrmodules 列出进程中的托管模块。
clrstack 仅提供托管代码的堆栈跟踪。
clrthreads 列出正在运行的托管线程。
clru 显示托管方法的批注反汇编。
dreadmemory 转储内存内容。
dbgout 启用/禁用 (-off) 内部 SOS 日志记录。
dso 显示在当前堆栈的边界内找到的所有托管对象。
dumpalc 显示有关指定对象加载到的可回收 AssemblyLoadContext 的详细信息。
dumparray 显示有关托管数组的详细信息。
dumpasync 显示有关垃圾回收堆上异步状态机的信息。
dumpassembly 显示有关程序集的详细信息。
dumpclass 显示有关指定地址处的 EEClass 结构的信息。
dumpconcurrentdictionary 显示并发字典内容。
dumpconcurrentqueue 显示并发队列内容。
dumpdelegate 显示有关委托的信息。
dumpdomain 显示有关所有 AppDomain 或指定 AppDomain 中的所有程序集的信息。
dumpgcdata 显示有关 GC 数据的信息。
dumpgen 显示指定代系的堆内容。
dumpheap 显示有关垃圾回收堆的信息和有关对象的收集统计信息。
dumpil 显示与托管方法关联的公共中间语言(CIL)。
dumplog 将内存中压力日志的内容写入到指定文件。
dumpmd 显示有关指定地址处的 MethodDesc 结构的信息。
dumpmodule 显示有关指定地址处的模块的信息。
dumpmt 显示有关指定地址处的方法表的信息。
dumpobj 显示有关指定地址处的对象的信息。
dumpruntimetypes 查找 GC 堆中的所有 System.RuntimeType 对象,并输出它们引用的类型名称和 MethodTable。
dumpsig 转储由 <sigaddr> <moduleaddr> 指定的方法或字段的签名。
dumpsigelem 转储签名对象的单个元素。
dumpstackobjects 显示在当前堆栈的边界内找到的所有托管对象。
dumpvc 显示有关值类的字段的信息。
eeheap 显示有关内部运行时数据结构所使用的进程内存的信息。
eestack 对进程中的所有线程运行 dumpstack 命令。
eeversion 显示有关运行时和 SOS 版本的信息。
ehinfo 显示 JIT 方法中的异常处理块。
exitquit 退出交互模式。
finalizequeue 显示所有已进行终结注册的对象。
findappdomain 尝试解析 GC 对象的 AppDomain。
gchandles 显示有关进程中的垃圾回收器句柄的统计信息。
gcheapstat 显示有关垃圾回收器的统计信息。
gcinfo 显示方法的 JIT GC 编码。
gcroot 显示有关对指定地址处的对象的引用(或根)的信息。
gcwhere 显示指定地址在 GC 堆中的位置。
histclear 释放由 Hist 命令系列使用的任何资源。
histinit 从保存在调试对象中的压力日志初始化 SOS 结构。
histobj 检查所有压力日志重定位记录,并显示可能导致地址作为参数传入的垃圾回收重定位链。
histobjfind 显示在指定地址处引用对象的所有日志项。
histroot 显示与指定根的提升和重定位相关的信息。
histstats 显示压力日志统计信息。
ip2md 显示已 JIT 编译的代码中指定地址处的 MethodDesc 结构。
listnearobj 显示指定地址前后的对象。
logopen 启用控制台文件日志记录。
logclose 禁用控制台文件日志记录。
logging 启用/禁用内部 SOS 日志记录。
lmmodules 显示进程中的本机模块。
name2ee 显示指定模块中的指定类型或方法的 MethodTableEEClass 结构。
objsize 显示指定对象的大小。
parallelstacks 显示与 Visual Studio“并行堆栈”面板类似的合并线程堆栈。
pathto 显示从 <root><target> 的 GC 路径。
peprintexception 显示从指定地址处的 Exception 类派生的任何对象的字段并设置这些字段的格式。
rregisters 显示线程的寄存器。
runtimes 列出目标中的运行时或更改默认运行时。
setclrpath 使用 setclrpath <path> 设置加载 coreclr dac/dbi 文件的路径。
setsymbolserver 启用符号服务器支持。
sos 执行各种 coreclr 调试命令。 使用语法 sos <command-name> <args>。 有关详细信息,请使用 soshelp
soshelphelp 显示所有可用命令。
soshelp <command>help <command> 执行指定的命令。
syncblk 显示 SyncBlock 持有者信息。
taskstate 以人类可读格式显示任务状态。
threadpool 显示有关运行时线程池的信息。
threadpoolqueue 显示排队的线程池工作项。
threadstate 整齐输出线程状态的含义。
threads <threadid>setthread <threadid> 设置或显示 SOS 命令的当前线程 ID。
timerinfo 显示有关正在运行的计时器的信息。
token2ee 显示指定令牌和模块的 MethodTable 结构和 MethodDesc 结构。
traverseheap 以 CLR 探查器能够理解的格式将堆信息写入文件。
verifyheap 检查 GC 堆是否有损坏的迹象。
verifyobj 检查作为自变量传递的对象是否有损坏迹象。

注释

有关详细信息,请参阅 适用于 .NET 的 SOS 调试扩展

用于 dotnet-debug 附加到实时进程

以下示例演示如何附加到正在运行的 .NET 进程并调查线程池问题:

$ dotnet-debug attach 1902
Attaching to process: 1902 ...
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)
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String)
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String)
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String)
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[])

若要查看未经处理的异常,

> 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
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d

StackTraceString: <none>
HResult: 80131604

dotnet-debugdotnet-dump

dotnet-debugdotnet-dump 共享相同的 SOS 调试命令,但主要用途不同:

功能 / 特点 dotnet-debug dotnet-dump
附加到实时进程 ✔️
收集转储 ✔️
分析转储文件 ✔️ ✔️
列出 .NET 进程(ps ✔️

需要以交互方式调试实时进程时使用 dotnet-debug 。 需要收集转储或脱机分析转储时使用 dotnet-dump

另请参阅