检查托管堆栈跟踪 (dotnet-stack)
本文适用于:✔️ dotnet-stack
版本 5.0.221401 及更高版本
安装
可采用两种方法来下载和安装 dotnet-stack
:
dotnet 全局工具:
若要安装最新版
dotnet-stack
NuGet 包,请使用 dotnet tool install 命令:dotnet tool install --global dotnet-stack
直接下载:
下载与平台相匹配的工具可执行文件:
(OS) 平台 Windows x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
摘要
dotnet-stack [-h, --help] [--version] <command>
描述
dotnet-stack
工具:
- 是一个跨平台的 .NET Core 工具。
- 为目标 .NET 进程中的所有线程捕获和打印托管堆栈。
- 利用 .NET Core 运行时提供的
EventPipe
跟踪。
选项
-h|--help
显示命令行帮助。
--version
显示 dotnet-stack 实用工具的版本。
命令
命令 | 说明 |
---|---|
dotnet-stack 报告 | 打印目标进程中每个线程的堆栈跟踪。 |
dotnet-stack ps | 列出可从中收集堆栈跟踪的 dotnet 进程。 |
dotnet-stack 符号化 | 从堆栈跟踪中的方法标记和 IL 偏移量中获取行号。 |
dotnet-stack 报告
打印目标进程中每个线程的堆栈跟踪。
摘要
dotnet-stack report -p|--process-id <pid>
-n|--name <process-name>
[-h|--help]
选项
-n, --name <name>
要从中报告堆栈的进程的名称。
-p|--process-id <PID>
要从中报告堆栈的进程 ID。
dotnet-stack ps
列出可从中收集堆栈跟踪的 dotnet 进程。
dotnet-stack
版本 6.0.320703 及更高版本还显示每个进程的启动命令行参数(如果可用)。
摘要
dotnet-stack ps [-h|--help]
示例
假设使用命令 dotnet run --configuration Release
启动长时间运行的应用。 在另一个窗口中,运行 dotnet-stack ps
命令。 你将看到如下输出。 命令行参数(如果有)显示在 dotnet-stack
版本 6.0.320703 及更高版本中。
> dotnet-stack ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-stack 符号化
从堆栈跟踪中的方法标记和 IL 偏移量中获取行号。
摘要
dotnet-stack symbolicate <input-path> [-d|--search-dir] [-o|--output] [-c|--stdout] [-h|--help]
选项
-d, --search-dir <directory1 directory2 ...>
具有程序集和 pdb 的多个目录的路径。
-o, --output <output-path>
直接输出到文件。
-c, --stdout
直接输出到控制台。
示例
> cat stack.trace
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at DotnetStackSymbolicate.App.MethodA() in DotnetStackSymbolicate.dll:token 0x6000002+0x6
at DotnetStackSymbolicate.App..ctor() in DotnetStackSymbolicate.dll:token 0x6000003+0x51
at DotnetStackSymbolicate.Program.OnCreate() in DotnetStackSymbolicate.Tizen.dll:token 0x6000001+0x8
onSigabrt called
>
> dotnet-stack symbolicate stack.trace --stdout
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at DotnetStackSymbolicate.App.MethodA() in C:\DotnetStackSymbolicate\DotnetStackSymbolicate.cs:line 19
at DotnetStackSymbolicate.App..ctor() in C:\DotnetStackSymbolicate\DotnetStackSymbolicate.cs:line 38
at DotnetStackSymbolicate.Program.OnCreate() in C:\DotnetStackSymbolicate.Tizen\DotnetStackSymbolicate.Tizen.cs:line 12
onSigabrt called
Output: stack.trace.symbolicated
使用 dotnet-stack 报告托管堆栈
使用 dotnet-stack
报告托管堆栈:
获取要从中报告堆栈的 .NET Core 应用程序的进程标识符 (PID)。
- 例如,在 Windows 上,可以使用任务管理器或
tasklist
命令。 - 在 Linux 上,使用
ps
命令。 - dotnet-stack ps
- 例如,在 Windows 上,可以使用任务管理器或
运行下面的命令:
dotnet-stack report --process-id <PID>
前面的命令生成类似于以下内容的输出:
Thread (0x48839B): [Native Frames] System.Console!System.IO.StdInReader.ReadKey(bool&) System.Console!System.IO.SyncTextReader.ReadKey(bool&) System.Console!System.ConsolePal.ReadKey(bool) System.Console!System.Console.ReadKey() StackTracee!Tracee.Program.Main(class System.String[])
dotnet-stack
的输出遵循以下格式:- 输出中的注释以
#
为前缀。 - 每个线程都有一个标头,其中包含本机线程 ID:
Thread (<thread-id>):
。 - 堆栈帧遵循格式
Module!Method
。 - 转换为非托管代码在输出中表示为
[Native Frames]
。
# comment Thread (0x1234): module!Method module!Method Thread (0x5678): [Native Frames] Module!Method Module!Method
- 输出中的注释以
注意
对于非常大的应用程序,停止该进程可能需要很长的时间(长达几分钟)。 运行时需要发送捕获的所有托管代码的类型和方法信息来解析函数名称。