檢查受控堆疊追蹤 (dotnet-stack)
本文適用於: ✔️ dotnet-stack
5.0.221401 版與更新版本
安裝
有兩種方法可下載並安裝 dotnet-stack
:
dotnet 全域工具:
若要安裝最新發行版本的
dotnet-stack
NuGet 套件,請使用 dotnet 工具安裝命令: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 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
- 在 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
的輸出遵循下列格式:- 輸出中的註解前面會加上
#
。 - 每個執行緒都有一個標頭,其中包含原生執行緒識別碼:
Thread (<thread-id>):
。 - 堆疊框架使用
Module!Method
格式。 - 在輸出中,轉換為非受控程式碼以
[Native Frames]
表示。
# comment Thread (0x1234): module!Method module!Method Thread (0x5678): [Native Frames] Module!Method Module!Method
- 輸出中的註解前面會加上
注意
對於非常大的應用程式來說,停止處理序可能需要一段時間 (最長會有幾分鐘的時間)。 執行階段必須為擷取到要解析函式名稱的所有受控程式碼,傳送類型和方法資訊。