MDbg.exe (.NET Framework コマンド ライン デバッガー)

.NET Framework コマンド ライン デバッガーは、.NET Framework 共通言語ランタイムを対象としたプログラムに含まれるバグの検索と修復について、ツールの販売元とアプリケーション開発者を支援するツールです。 このツールは、ランタイムのデバッグ API を使用してデバッグ サービスを提供します。 MDbg.exe を使用してもマネージド コードのデバッグしか実行できません。アンマネージド コードのデバッグはサポートされていません。

このツールは NuGet からは入手できません。 インストールについては、「MDbg 0.1.0」をご覧ください。 このツールを実行するには、パッケージ マネージャー コンソールを使用します。 パッケージ マネージャー コンソールの使用方法について詳しくは、「パッケージ マネージャー コンソール」を参照してください。

パッケージ マネージャー プロンプトに次のように入力します。

構文

MDbg [ProgramName[arguments]] [options]

コマンド

デバッガーが起動したら (mdbg> プロンプトで示されます)、次のセクションで説明するコマンドのいずれかを入力します。

コマンド [引数]

MDbg.exe コマンドでは、大文字と小文字が区別されます。

コマンド 説明
ap[rocess] [number] デバッグされている別のプロセスに切り替えたり、使用できるプロセスを出力したりします。 この番号は実際のプロセス ID (PID) ではなく、インデックスが 0 から始まるリストです。
a[ttach] [pid] プロセスにアタッチしたり、使用できるプロセスを出力したりします。
b[reak] [ClassName.Method | FileName:LineNo] 指定したメソッドにブレークポイントを設定します。 モジュールは順次スキャンされます。

- breakFileName:LineNo は、ソース内の位置にブレークポイントを設定します。
- break~number は、x コマンドで最近表示されたシンボルにブレークポイントを設定します。
- breakmodule!ClassName.Method+IlOffset は、完全修飾位置にブレークポイントを設定します。
block[ingObjects] ブロッキング スレッドであるモニター ロックを表示します。
ca[tch] [exceptionType] 未処理の例外だけでなく、すべての例外でデバッガーが中断されます。
cl[earException] 実行を継続できるように、現在の例外を処理済みとしてマークします。 例外の原因が処理されていない場合は、例外がすぐに再スローされる可能性があります。
conf[ig] [option value] 設定可能なすべてのオプションと、省略可能な値を指定せずにオプションを起動する方法を表示します。 オプションを指定する場合は、value を現在のオプションとして設定します。 次の各オプションを現在使用できます。

- extpath は、load コマンドの使用時に、拡張機能の検索対象となるパスを設定します。
- extpath+ は、拡張機能を読み込むパスを追加します。
del[ete] ブレークポイントを削除します。
de[tach] デバッグされているプロセスからデタッチします。
d[own] [frames] アクティブなスタック フレームを下へ移動します。
echo メッセージをコンソールにエコーします。
enableNotif[ication] typeName 0|1 指定した種類のカスタム通知を有効 (1) または無効 (0) にします。
ex[it] [exitcode] MDbg.exe シェルを終了します。プロセス終了コードを指定することもできます。
fo[reach] [OtherCommand] すべてのスレッドでコマンドを実行します。 OtherCommand は、1 つのスレッドで動作する有効なコマンドです。foreachOtherCommand は、すべてのスレッドで同じコマンドを実行します。
f[unceval] [-adNum] functionName [args ... ] 現在のアクティブ スレッドで関数評価を実行します。functionName は、評価する関数です。 関数名には、名前空間を含めた完全修飾名を指定する必要があります。

-ad オプションは、関数の解決に使用するアプリケーション ドメインを指定します。 -ad オプションが指定されていない場合、解決に使用するアプリケーション ドメインは、関数評価に使用するスレッドが配置されたアプリケーション ドメインに既定で設定されます。

評価対象の関数が静的ではない場合、渡される最初のパラメーターは this ポインターであることが必要です。 すべてのアプリケーション ドメインで、関数評価のための引数が検索されます。

アプリケーション ドメインから値を要求するには、変数の先頭にモジュール名とアプリケーション ドメイン名を付けます。たとえば、funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef のようにします。 このコマンドは、アプリケーション ドメイン System.Object.ToString0 関数を評価します。 ToString メソッドはインスタンス関数であるため、最初のパラメーターは this ポインターであることが必要です。
g[o] ブレークポイントに到達し、プログラムが終了するか、イベント (未処理の例外など) によってプログラムが中断されるまで、プログラムは続行されます。
h[elp] [command]

\- または -

? [command]
すべてのコマンドの説明、または指定したコマンドの詳細な説明を表示します。
ig[nore] [event] 未処理の例外の発生時にだけデバッガーが停止します。
int[ercept]FrameNumber デバッガーを指定したフレーム番号にロールバックします。

デバッガーの実行時に例外が発生した場合は、このコマンドを使用してデバッガーを指定したフレーム番号にロールバックします。 set コマンドを使用してプログラムの状態を変更し、go コマンドを使用して続行できます。
k[ill] アクティブ プロセスを停止します。
l[ist] [modules | appdomains | assemblies] 読み込まれたモジュール、アプリケーション ドメイン、またはアセンブリを表示します。
lo[ad]assemblyName 拡張機能を読み込みます。指定したアセンブリが読み込まれた後、Microsoft.Tools.Mdbg.Extension.Extension 型の静的メソッド LoadExtension の実行が試行され、拡張機能が読み込まれます。
log [eventType] ログに記録するイベントを設定または表示します。
mo[de] [option on/off] デバッガーのさまざまなオプションを設定します。 オプションを指定せずに mode を使用すると、デバッグ モードとその現在の設定のリストが取得されます。
mon[itorInfo]monitorReference オブジェクトのモニター ロックの情報を表示します。
newo[bj]typeName [arguments... ] typeName 型の新しいオブジェクトを作成します。
n[ext] コードを実行し、次の行に移動します (次の行に多数の関数呼び出しが含まれている場合も同様です)。
OpendumppathToDumpFile 指定されたダンプ ファイルをデバッグ用に開きます。
o[ut] 現在の関数の末尾に移動します。
pa[th] [pathName] バイナリの場所が使用できない場合に、指定したパスでソース ファイルを検索します。
p[rint] [var] | [-d] スコープ内のすべての変数の出力 (print)、指定した変数の出力 (printvar)、またはデバッガー変数の出力 (print-d ) を実行します。
printe[xception] [ -r] 現在のスレッドで最後にスローされた例外を出力します。 –r (再帰的) オプションを使用すると、例外オブジェクトで InnerException プロパティが走査され、例外のチェーン全体に関する情報が取得されます。
pro[cessenum] アクティブ プロセスを表示します。
q[uit] [exitcode] MDbg.exe シェルを終了します。プロセス終了コードを指定することもできます。
re[sume] [* | [~]threadNumber] 現在のスレッドまたは threadNumber パラメーターで指定したスレッドを再開します。

threadNumber パラメーターに * を指定した場合、またはスレッド番号が ~ で始まる場合には、コマンドは threadNumber で指定したスレッドを除くすべてのスレッドに適用されます。

中断されていないスレッドを再開しても無効になります。
r[un] [-d(ebug) | -o(ptimize) |-enc] [[path_to_exe] [args_to_exe]] 現在のプロセス (存在する場合) を停止し、新しいプロセスを起動します。 実行可能な引数が渡されなかった場合、このコマンドは run コマンドによって以前に実行されたプログラムを実行します。 実行可能な引数が渡された場合は、オプションで指定した引数を使用して、指定したプログラムが実行されます。

クラス読み込みイベント、モジュール読み込みイベント、およびスレッド起動イベントが無視される場合 (既定の状態)、このプログラムはメイン スレッドの最初の実行可能命令で停止します。

次の 3 つのフラグのいずれかを使用すると、デバッガーに強制的にコードを JIT (Just-In-Time) コンパイルさせることができます。

- -d(ebug) は、最適化を無効にします。 これは MDbg.exe の既定値です。
- -o(ptimize) は、デバッガーの外部で実行する場合のように、コードを強制的に実行しますが、デバッグが困難になります。 これは、デバッガーの外部で使用するための既定値です。
- -enc は、エディット コンティニュ機能を有効にしますが、パフォーマンスに影響します。
Setvariable=value スコープ内の変数の値を変更します。

独自のデバッガー変数を作成し、アプリケーション内から参照値を割り当てることもできます。 元の値がスコープの外であっても、これらの値は元の値に対するハンドルとして機能します。 すべてのデバッガー変数は、$ で始まる必要があります (例: $var)。 次のコマンドを使用して、これらのハンドルに何も設定しないことでハンドルを削除できます。

set $var=
Setip [-il] number ファイル内の現在の命令ポインター (IP: Instruction Pointer) を指定した位置に設定します。 このオプションを -il 指定した場合、数値はメソッド内の共通中間言語 (CIL) オフセットを表します。 それ以外の場合は、数値はソースの行番号を表します。
sh[ow] [lines] 表示する行数を指定します。
s[tep] 現在の行の次の関数の実行に移ります。実行する関数がない場合は、次の行に移動します。
su[spend] [* | [~]threadNumber] 現在のスレッドまたは threadNumber パラメーターで指定したスレッドを中断します。 threadNumber* を指定した場合、コマンドはすべてのスレッドに適用されます。 スレッド番号が ~ で始まる場合、コマンドは threadNumber で指定したスレッドを除くすべてのスレッドに適用されます。 プロセスが go コマンドまたは step コマンドによって実行されている場合、中断されたスレッドは実行から除外されます。 プロセス内に中断されているスレッドがない場合に go コマンドを実行しても、プロセスは続行されません。 この場合、Ctrl キーを押しながら C キーを押してプロセスを中止する必要があります。
sy[mbol]commandName [commandValue] 次のコマンドのいずれかを指定します。

- symbol path ["value"] - 現在のシンボル パスを表示または設定します。
- symbol addpath"value" - 現在のシンボル パスに追加します。
- symbol reload ["module"] - すべてのシンボルまたは指定したモジュールのシンボルを再読み込みします。
- symbol list [module] - すべてのモジュールまたは指定したモジュールの現在読み込まれているシンボルを表示します。
t[hread] [newThread] [-nick nickname] パラメーターを指定しないで thread コマンドを実行すると、現在のプロセス内のすべてのマネージド スレッドが表示されます。 通常、スレッドはスレッド番号で識別されますが、スレッドにニックネームが割り当てられている場合は、スレッド番号ではなくニックネームが表示されます。 -nick パラメーターを使用すると、スレッドにニックネームを割り当てることができます。

- thread-nickthreadName は、現在実行中のスレッドにニックネームを割り当てます。

ニックネームを数字にすることはできません。 現在のスレッドにニックネームが既に割り当てられている場合、古いニックネームは新しいニックネームに置き換えられます。 新しいニックネームが空の文字列 ("") の場合は、現在のスレッドのニックネームが削除され、新しいニックネームはスレッドに割り当てられません。
u[p] アクティブなスタック フレームを上へ移動します。
uwgc[handle] [var] | [address] ハンドルによって追跡された変数を出力します。 ハンドルは、名前またはアドレスで指定できます。
when 現在アクティブな when ステートメントを表示します。

whendelete all | num [num [num …]] - 番号で指定された when ステートメントを削除します。all が指定されている場合は、すべての when ステートメントを削除します。

whenstopReason [specific_condition] docmd [cmd [cmd …] ] - stopReason パラメーターには、次のいずれかの値を指定できます。

StepComplete, ProcessExited, ThreadCreated, , BreakpointHit, ModuleLoaded, ClassLoaded, , AssemblyLoaded, AssemblyUnloaded, ControlCTrapped, , ExceptionThrown, , UnhandledExceptionThrown, AsyncStop, AttachComplete, UserBreak, NativeStopEvalCompleteEvalExceptionRemapOpportunityReached.

specific_condition には、次のいずれかの値を指定できます。

- number - ThreadCreated および BreakpointHit の場合、同じ値を持つスレッド ID 番号とブレークポイント番号によって停止した場合にだけアクションを発生させます。
- [!]name - ModuleLoadedClassLoadedAssemblyLoadedAssemblyUnloadedExceptionThrownUnhandledExceptionThrown の場合、名前が stopReason の名前と一致する場合にだけアクションをトリガーします。

specific_condition は、stopReason の他の値に対しては空であることが必要です。
w[here] [-v] [-cdepth] [threadID] スタック フレームのデバッグ情報を表示します。

- -v オプションを指定すると、表示された各スタック フレームの詳細情報が表示されます。
- depth に数値を指定すると、表示するフレームの数を制限できます。 すべてのフレームを表示するには、all コマンドを使用します。 既定値は 100 です。
- threadID パラメーターを指定すると、スタックに関連付けるスレッドを制御できます。 既定値は、現在のスレッドのみです。 すべてのスレッドを取得するには、all コマンドを使用します。
x [-cnumSymbols] [module[!pattern]] モジュールの pattern に一致する関数を表示します。

numSymbols を指定すると、出力が指定した数に制限されます。 ! (正規表現を示す) が pattern に対して指定されていない場合は、すべての関数が表示されます。 module が指定されていない場合は、読み込まれたすべてのモジュールが表示されます。 break コマンドを使用してブレークポイントを設定するには、シンボル (~#) を使用します。

Remarks

デバッグするアプリケーションをコンパイルするときは、コンパイラ固有のフラグを使用します。このフラグによって、コンパイラがデバッグ シンボルを生成します。 コンパイラ固有のフラグの詳細については、コンパイラのドキュメントを参照してください。 最適化したアプリケーションでもデバッグはできますが、一部のデバッグ情報が欠落しています。 たとえば、ローカル変数の多くを表示できなくなり、ソース行も不正確になります。

アプリケーションをコンパイルした後、コマンド プロンプトに「mdbg」と入力してデバッグ セッションを開始します。例を次に示します。

C:\Program Files\Microsoft Visual Studio 8\VC>mdbg
MDbg (Managed debugger) v2.0.50727.42 (RTM.050727-4200) started.
Copyright (C) Microsoft Corporation. All rights reserved.

For information about commands type "help";
to exit program type "quit".
mdbg>

mdbg> プロンプトは、デバッガーが起動したことを表します。

デバッガーが起動したら、前のセクションで説明したコマンドと引数を使用します。

関連項目