マネージド スタック トレースを調べる (dotnet-stack)
この記事の対象: ✔️ dotnet-stack
バージョン 5.0.221401 以降のバージョン
インストール
dotnet-stack
をダウンロードしてインストールするには、次の 2 つの方法があります。
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 ユーティリティのバージョンを表示します。
コマンド
command | 説明 |
---|---|
dotnet-stack report | ターゲット プロセスの各スレッドのスタック トレースを出力します。 |
dotnet-stack ps | スタック トレースを収集できる dotnet プロセスの一覧を表示します。 |
dotnet-stack シンボリック | StackTrace のメソッド トークンと IL オフセットから行番号を取得します。 |
dotnet-stack report
ターゲット プロセスの各スレッドのスタック トレースを出力します。
構文
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 シンボリック
StackTrace のメソッド トークンと 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
- 出力のコメントには、
注意
特に大きなアプリケーションでは、プロセスの停止に時間がかかる場合があります (最大で数分間)。 ランタイムは、関数名を解決するためにキャプチャされたすべてのマネージド コードの型とメソッド情報を送信する必要があります。
次のステップ
.NET