本文适用于: ✔️ dotnet-debug 版本 0.0.710501 及更高版本
注释
dotnet-debug 目前仅支持基于 CoreCLR 的应用程序,目前在 macOS 上不受支持。
Install
可采用两种方法来下载和安装 dotnet-debug:
dotnet 全局工具:
若要安装最新版
dotnet-debugNuGet 包,请使用 dotnet tool install 命令:dotnet tool install --global dotnet-debug直接下载:
下载与平台相匹配的工具可执行文件:
操作系统 平台 Windows操作系统 x86 | x64 | 手臂 | Arm-x64 Linux x64 | 手臂 | Arm64 | musl-x64 | musl-Arm64
概要
dotnet-debug [-h|--help] [--version] <command>
Description
使用 dotnet-debug 全局工具,可以附加到实时 .NET 进程并交互式分析转储文件。 与专注于转储收集和脱机分析不同 dotnet-dump, dotnet-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 |
显示托管方法的批注反汇编。 |
d 或 readmemory |
转储内存内容。 |
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 方法中的异常处理块。 |
exit 或 quit |
退出交互模式。 |
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 日志记录。 |
lm 或 modules |
显示进程中的本机模块。 |
name2ee |
显示指定模块中的指定类型或方法的 MethodTable 和 EEClass 结构。 |
objsize |
显示指定对象的大小。 |
parallelstacks |
显示与 Visual Studio“并行堆栈”面板类似的合并线程堆栈。 |
pathto |
显示从 <root> 到 <target> 的 GC 路径。 |
pe 或 printexception |
显示从指定地址处的 Exception 类派生的任何对象的字段并设置这些字段的格式。 |
r 或 registers |
显示线程的寄存器。 |
runtimes |
列出目标中的运行时或更改默认运行时。 |
setclrpath |
使用 setclrpath <path> 设置加载 coreclr dac/dbi 文件的路径。 |
setsymbolserver |
启用符号服务器支持。 |
sos |
执行各种 coreclr 调试命令。 使用语法 sos <command-name> <args>。 有关详细信息,请使用 soshelp。 |
soshelp 或 help |
显示所有可用命令。 |
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-debug 与 dotnet-dump
dotnet-debug 并 dotnet-dump 共享相同的 SOS 调试命令,但主要用途不同:
| 功能 / 特点 | dotnet-debug |
dotnet-dump |
|---|---|---|
| 附加到实时进程 | ✔️ | ❌ |
| 收集转储 | ❌ | ✔️ |
| 分析转储文件 | ✔️ | ✔️ |
列出 .NET 进程(ps) |
❌ | ✔️ |
需要以交互方式调试实时进程时使用 dotnet-debug 。 需要收集转储或脱机分析转储时使用 dotnet-dump 。