ライブ プロセスのデバッグとダンプ分析ユーティリティ (dotnet-debug)

この記事の対象: ✔️ dotnet-debug バージョン 0.0.710501 以降のバージョン

dotnet-debug 現在、CoreCLR ベースのアプリケーションのみがサポートされており、現在 macOS ではサポートされていません。

Install

dotnet-debug NuGet パッケージの最新のリリース バージョンをインストールするには、次のように dotnet tool install コマンドを使用します。

dotnet tool install --global dotnet-debug

概要

dotnet-debug [-h|--help] [--version] <command>

Description

dotnet-debug グローバル ツールを使用すると、ライブ .NET プロセスにアタッチし、ダンプ ファイルを対話形式で分析できます。 ダンプ収集とオフライン分析に焦点を当てた dotnet-dumpとは異なり、 dotnet-debug はライブ プロセス検査用に設計されています。 と同じ dotnet-dumpがすべてサポートされます。

このツールは、完全に動作する lldb が利用できない Alpine Linux などのプラットフォームで役立ちます。 dotnet-debug ツールは SOS コマンドを実行してマネージド状態とヒープの診断を分析しますが、ネイティブ デバッガーではないので、ネイティブ スタック フレームの表示はサポートされていません。

オプション

  • --version

    dotnet-debug ユーティリティのバージョンを表示します。

  • -h|--help

    コマンド ライン ヘルプを表示します。

Commands

Command
dotnet-debug attach
dotnet-debug open-dump

dotnet-debug attach

ライブ プロセスにアタッチし、デバッグ コマンドを使用して対話型シェルを開始して探索します。

概要

dotnet-debug attach <process-id> [-c|--commands <debug_command>] [--accept-license-agreement]

論争

  • <process-id>

    アタッチして分析するプロセス ID。

オプション

  • -c|--commands <debug_command>

    起動時にコマンドを実行します。 1 つの呼び出しでこのパラメーターの複数インスタンスを使って、コマンドを連鎖させることができます。 コマンドは、コマンド ラインで指定された順序で実行されます。 コマンドの後 dotnet-debug 終了する場合は、最後のコマンドを exitする必要があります。

  • --accept-license-agreement

    確認を求めずにライセンス契約に同意します。

Example

ID 1234 で実行中のプロセスにアタッチします。

$ dotnet-debug attach 1234
Attaching to process: 1234 ...
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>

アタッチ時にコマンドを実行し、終了します。

dotnet-debug attach 1234 -c clrstack -c exit

dotnet-debug open-dump

デバッグ コマンドを使用して対話型シェルを起動し、ダンプ ファイルを探索します。

概要

dotnet-debug open-dump <dump_path> [-c|--commands] [--accept-license-agreement]

論争

  • <dump_path>

    分析するダンプ ファイルへのパス。

オプション

  • -c|--commands <debug_command>

    起動時にコマンドを実行します。 1 つの呼び出しでこのパラメーターの複数インスタンスを使って、コマンドを連鎖させることができます。 コマンドは、コマンド ラインで指定された順序で実行されます。 コマンドの後 dotnet-debug 終了する場合は、最後のコマンドを exitする必要があります。

  • --accept-license-agreement

    確認を求めずにライセンス契約に同意します。

Example

ダンプ ファイルを開いて分析します。

$ dotnet-debug open-dump ./core_20260209_135837
Loading dump: ./core_20260209_135837 ...
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>

SOS コマンドのデバッグ

attachコマンドとopen-dump コマンドの両方で、次の SOS コマンドを受け入れる対話型セッションが表示されます。

Command 機能
analyzeoom GC ヒープへの割り当て要求で発生した最後の OOM の情報を表示します。
clrmodules プロセス内のマネージド モジュールを一覧表示します。
clrstack マネージド コードのみのスタック トレースを提供します。
clrthreads 実行中のマネージド スレッドを一覧表示します。
clru マネージド メソッドの注釈付き逆アセンブリを表示します。
d または readmemory メモリの内容をダンプします。
dbgout 内部 SOS ログを有効/無効 (-off) にします。
dso 現在のスタックの範囲内で見つかったすべてのマネージド オブジェクトを表示します。
dumpalc 指定したオブジェクトが読み込まれる先の収集可能な AssemblyLoadContext に関する詳細を表示します。
dumparray マネージド配列に関する詳細を表示します。
dumpasync ガベージ コレクトされたヒープ上の非同期状態機械に関する情報を表示します。
dumpassembly アセンブリに関する詳細を表示します。
dumpclass 指定されたアドレスにある EEClass 構造体に関する情報を表示します。
dumpconcurrentdictionary 同時実行辞書の内容を表示します。
dumpconcurrentqueue 同時実行キューの内容を表示します。
dumpdelegate デリゲートに関する情報を表示します。
dumpdomain すべての AppDomain または指定されたドメイン内のすべてのアセンブリに関する情報を表示します。
dumpgcdata GC データに関する情報を表示します。
dumpgen 指定した世代のヒープの内容を表示します。
dumpheap ガベージ コレクトされたヒープと、オブジェクトの収集統計に関する情報を表示します。
dumpil マネージド メソッドに関連付けられている共通中間言語 (CIL) を表示します。
dumplog メモリ内ストレス ログの内容を、指定したファイルに書き込みます。
dumpmd 指定されたアドレスにある MethodDesc 構造体に関する情報を表示します。
dumpmodule 指定されたアドレスにあるモジュールに関する情報を表示します。
dumpmt 指定されたアドレスにあるメソッド テーブルに関する情報を表示します。
dumpobj 指定されたアドレスにあるオブジェクトに関する情報を表示します。
dumpruntimetypes GC ヒープ内のすべての System.RuntimeType オブジェクトを検索し、参照する型名と MethodTable を出力します。
dumpsig <sigaddr> <moduleaddr> で指定されたメソッドまたはフィールドのシグネチャをダンプします。
dumpsigelem シグネチャ オブジェクトの 1 つの要素をダンプします。
dumpstackobjects 現在のスタックの範囲内で見つかったすべてのマネージド オブジェクトを表示します。
dumpvc 値クラスのフィールドに関する情報を表示します。
eeheap 内部のランタイム データ構造体によって消費されたプロセス メモリに関する情報を表示します。
eestack プロセス内のすべてのスレッドに対して dumpstack を実行します。
eeversion ランタイムと SOS のバージョンに関する情報を表示します。
ehinfo JIT されたメソッドの例外処理ブロックを表示します。
exit または quit 対話モードを終了します。
finalizequeue 完了の目的で登録されているすべてのオブジェクトを表示します。
findappdomain GC オブジェクトの AppDomain の解決を試みます。
gchandles プロセス内のガベージ コレクター ハンドルに関する統計を表示します。
gcheapstat ガベージ コレクターに関する統計情報を表示します。
gcinfo メソッドの JIT GC エンコードを表示します。
gcroot 指定されたアドレスにあるオブジェクトへの参照 (またはルート) に関する情報を表示します。
gcwhere 指定されたアドレスの GC ヒープ内の場所を表示します。
histclear Hist コマンドのファミリによって使用されているすべてのリソースを解放します。
histinit デバッグ対象に保存されているストレス ログから SOS 構造体を初期化します。
histobj すべてのストレス ログ再配置レコードを調べ、引数として渡されたアドレスにつながる可能性があるガベージ コレクション再配置のチェーンを表示します。
histobjfind 指定されたアドレスにあるオブジェクトを参照するすべてのログ エントリを表示します。
histroot 指定したルートの上位変換と再配置の両方に関係する情報を表示します。
histstats ストレス ログの統計を表示します。
ip2md JIT コンパイルされたコード内の指定したアドレスにある MethodDesc 構造体を表示します。
listnearobj 指定されたアドレスの前および後にあるオブジェクトを表示します。
logopen コンソール ファイル ログを有効にします。
logclose コンソール ファイル ログを無効にします。
logging 内部 SOS ログを有効/無効にします。
lm または modules プロセス内のネイティブ モジュールを表示します。
name2ee 指定されたモジュール内の指定の型またはメソッドの MethodTable および EEClass 構造体を表示します。
objsize 指定したオブジェクトのサイズを表示します。
parallelstacks マージされたスレッド スタックを Visual Studio の '並列スタック' パネルと同様に表示します。
pathto <root> から <target> への GC パスを表示します。
pe または printexception 指定したアドレスにある Exception クラスから派生したすべてのオブジェクトのフィールドが表示および書式設定されます。
r または registers スレッドのレジスタを表示します。
runtimes ターゲット内のランタイムを一覧表示するか、既定のランタイムを変更します。
setclrpath setclrpath <path> を使用して coreclr dac/dbi ファイルを読み込むためのパスを設定します。
setsymbolserver シンボル サーバーのサポートを有効にします。
sos さまざまな coreclr デバッグ コマンドを実行します。 構文 sos <command-name> <args> を使用します。 詳細については、 soshelpを使用してください。
soshelp または help 使用可能なコマンドをすべて表示します。
soshelp <command> または help <command> 指定したコマンドを表示します。
syncblk SyncBlock の所有者の情報を表示します。
taskstate タスクの状態を人間が判読できる形式で表示します。
threadpool ランタイム スレッド プールに関する情報を表示します。
threadpoolqueue キューに登録されたスレッド プールの作業項目を表示します。
threadstate Pretty はスレッド状態の意味を出力します。
threads <threadid> または setthread <threadid> SOS コマンドの現在のスレッド ID を設定するか表示します。
timerinfo 実行タイマーに関する情報を表示します。
token2ee 指定されたトークンとモジュールの MethodTable 構造体と MethodDesc 構造体を表示します。
traverseheap ヒープ情報を、CLR プロファイラーが解釈できる形式でファイルに書き込みます。
verifyheap 破損の兆候がないか GC ヒープを確認します。
verifyobj 引数として渡されたオブジェクトで破損の兆候を調べます。

詳細については、「 .NET 用 SOS デバッグ拡張機能」を参照してください。

dotnet-debugを使用してライブ プロセスにアタッチする

次の例は、実行中の .NET プロセスにアタッチし、スレッド プールの問題を調査する方法を示しています。

$ dotnet-debug attach 1902
Attaching to process: 1902 ...
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>

この操作により、次のようなコマンドを受け取る対話型セッションが開始されます。

> clrstack
OS Thread Id: 0x573d (0)
    Child SP               IP Call Site
00007FFD28B42C58 00007fb22c1a8ed9 [HelperMethodFrame_PROTECTOBJ: 00007ffd28b42c58] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String)
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String)
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String)
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[])

ハンドルされない例外を表示するには:

> pe -lines
Exception object: 00007fb18c038590
Exception type:   System.Reflection.TargetInvocationException
Message:          Exception has been thrown by the target of an invocation.
InnerException:   System.Exception, Use !PrintException 00007FB18C038368 to see more.
StackTrace (generated):
SP               IP               Function
00007FFD28B42DD0 0000000000000000 System.Private.CoreLib.dll!System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+0xa7
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d

StackTraceString: <none>
HResult: 80131604

dotnet-debugdotnet-dump

dotnet-debugdotnet-dump 同じ SOS デバッグ コマンドを共有しますが、主な目的は異なります。

特徴 dotnet-debug dotnet-dump
ライブ プロセスにアタッチする ✔️
ダンプの収集 ✔️
ダンプ ファイルの分析 ✔️ ✔️
.NET プロセスの一覧表示 (ps) ✔️

ライブ プロセスを対話形式でデバッグする必要がある場合は、 dotnet-debug を使用します。 ダンプを収集したり、オフラインで分析したりする必要がある場合は、 dotnet-dump を使用します。

こちらも参照ください