分享方式:


檢查受控堆疊追蹤 (dotnet-stack)

本文適用於: ✔️ dotnet-stack 5.0.221401 版與更新版本

安裝

有兩種方法可下載並安裝 dotnet-stack

概要

dotnet-stack [-h, --help] [--version] <command>

描述

dotnet-stack 工具:

  • 是跨平台的 .NET Core 工具。
  • 可擷取及列印目標 .NET 處理序中所有執行緒的受控堆疊。
  • 使用由 .NET Core Runtime 所提供的 EventPipe 追蹤。

選項。

  • -h|--help

    顯示命令列說明。

  • --version

    顯示 dotnet-stack 公用程式的版本。

命令

命令 描述
dotnet-stack report 列印目標處理序中每個執行緒的堆疊追蹤。
dotnet-stack ps 列出收集其堆疊追蹤的 dotnet 處理序。
dotnet-stack symbolicate 取得堆疊追蹤中,方法權杖和 IL 位移的行號。

dotnet-stack report

列印目標處理序中每個執行緒的堆疊追蹤。

概要

dotnet-stack report -p|--process-id <pid>
                    -n|--name <process-name>
                    [-h|--help]

選項。

  • -n, --name <name>

    回報其堆疊的處理序名稱。

  • -p|--process-id <PID>

    回報其堆疊的處理序識別碼。

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 symbolicate

取得堆疊追蹤中,方法權杖和 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 的輸出遵循下列格式:

    • 輸出中的註解前面會加上 #
    • 每個執行緒都有一個標頭,其中包含原生執行緒識別碼:Thread (<thread-id>):
    • 堆疊框架使用 Module!Method 格式。
    • 在輸出中,轉換為非受控程式碼以 [Native Frames] 表示。
    # comment
    Thread (0x1234):
      module!Method
      module!Method
    
    Thread (0x5678):
      [Native Frames]
      Module!Method
      Module!Method
    

注意

對於非常大的應用程式來說,停止處理序可能需要一段時間 (最長會有幾分鐘的時間)。 執行階段必須為擷取到要解析函式名稱的所有受控程式碼,傳送類型和方法資訊。

下一步