この記事の対象: ✔️ 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 コマンドを実行してマネージド状態とヒープの診断を分析しますが、ネイティブ デバッガーではないので、ネイティブ スタック フレームの表示はサポートされていません。
オプション
--versiondotnet-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-debug と dotnet-dump
dotnet-debug と dotnet-dump 同じ SOS デバッグ コマンドを共有しますが、主な目的は異なります。
| 特徴 | dotnet-debug |
dotnet-dump |
|---|---|---|
| ライブ プロセスにアタッチする | ✔️ | ❌ |
| ダンプの収集 | ❌ | ✔️ |
| ダンプ ファイルの分析 | ✔️ | ✔️ |
.NET プロセスの一覧表示 (ps) |
❌ | ✔️ |
ライブ プロセスを対話形式でデバッグする必要がある場合は、 dotnet-debug を使用します。 ダンプを収集したり、オフラインで分析したりする必要がある場合は、 dotnet-dump を使用します。
こちらも参照ください
.NET