检查托管堆栈跟踪 (dotnet-stack)

本文适用于:✔️ dotnet-stack 版本 5.0.221401 及更高版本

安装

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

摘要

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
  • 运行下面的命令:

    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
    

注意

对于非常大的应用程序,停止该进程可能需要很长的时间(长达几分钟)。 运行时需要发送捕获的所有托管代码的类型和方法信息来解析函数名称。

后续步骤