マネージド スタック トレースを調べる (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
  • 次のコマンドを実行します。

    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
    

注意

特に大きなアプリケーションでは、プロセスの停止に時間がかかる場合があります (最大で数分間)。 ランタイムは、関数名を解決するためにキャプチャされたすべてのマネージド コードの型とメソッド情報を送信する必要があります。

次のステップ