.NET Framework コマンド ライン デバッガ (MDbg.exe)
更新 : 2007 年 11 月
.NET Framework コマンド ライン デバッガは、.NET Framework 共通言語ランタイムを対象としたプログラムに含まれるバグの検索と修復について、ツールの販売元とアプリケーション開発者を支援するツールです。このツールは、ランタイム Debug API を使用してデバッグ サービスを提供します。MDbg.exe のソース コードは、Windows Software Development Kit (SDK) のサンプル アプリケーションとして公開されています。開発者は、このコードを検討することで、デバッグ サービスの使用方法を学習できます。現時点では、MDbg.exe を使用してもマネージ コードのデバッグしか実行できません。アンマネージ コードのデバッグはサポートされていません。
MDbg [ProgramName[Program arguments]] [optional arguments ]
command [command arguments]
コマンド
コマンド |
説明 |
---|---|
ap[rocess] [number] |
デバッグされている別のプロセスに切り替えたり、使用できるプロセスを出力したりします。この番号は実際の PID ではなく、インデックスが 0 から始まるリストです。 |
a[ttach] [pid] |
プロセスにアタッチしたり、使用できるプロセスを出力したりします。 |
b[reak] [ClassName.Method | FileName:LineNo] |
指定したメソッドにブレークポイントを設定します。モジュールは順次スキャンされます。break FileName:LineNo は、ソース内の位置にブレークポイントを設定します。break ~number は、x コマンドで最近表示されたシンボルにブレークポイントを設定します。break module!ClassName.Method+IlOffset は、完全修飾位置にブレークポイントを設定します。 |
ca[tch] [exceptionType] |
未処理の例外だけでなく、すべての例外でデバッガが中断されます。 |
conf[ig] [option value] |
設定可能なすべてのオプションと、省略可能な値を指定せずにオプションを起動する方法を表示します。オプションを指定する場合は、value を現在のオプションとして設定します。 現在利用できるオプションは次のとおりです。 extpath : load コマンドの使用時に、拡張機能の検索対象となるパスを設定します。 extpath+ : 拡張機能を読み込むことができる既存のパスにパスを追加します。 |
del[ete] |
ブレークポイントを削除します。 |
de[tach] |
デバッグされているプロセスからデタッチします。 |
d[own] [frames] |
アクティブなスタック フレームを下に移動します。 |
echo |
メッセージをコンソールにエコーします。 |
ex[it] [exitcode] |
MDbg.exe シェルを終了します。プロセス終了コードを指定することもできます。 |
fo[reach] [OtherCommand] |
すべてのスレッドでコマンドを実行します。OtherCommand は、1 つのスレッドで動作する有効なコマンドです。foreach OtherCommand は、すべてのスレッドで同じコマンドを実行します。 |
f[unceval] [-ad Num] functionName [args ...] |
現在のアクティブ スレッドで関数評価を実行します。functionName は、評価する関数です。関数名には、名前空間を含めた完全修飾名を指定する必要があります。 -ad オプションは、関数の解決に使用するアプリケーション ドメインを指定します。-ad オプションが指定されていない場合、解決に使用するアプリケーション ドメインは、関数評価に使用するスレッドが配置されたアプリケーション ドメインに既定で設定されます。 評価対象の関数が静的ではない場合、渡される最初のパラメータは this ポインタであることが必要です。すべてのアプリケーション ドメインで、関数評価のための引数が検索されます。 アプリケーション ドメインから値を要求するには、変数の先頭にモジュール名とアプリケーション ドメイン名を付けます。たとえば、funceval -ad 0 System.Object.ToString hello.exe#0!MyClass.g_rootRef のようにします。 このコマンドは、アプリケーション ドメイン 0 の System.Object.ToString 関数を評価します。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 の実行が試行され、拡張機能が読み込まれます。 |
mo[de] [option on/off] |
デバッガのさまざまなオプションを設定します。option パラメータには、2 文字の組み合わせを指定する必要があります。 |
newo[bj] typeName [arguments...] |
typeName 型の新しいオブジェクトを作成します。 |
n[ext] |
コードを実行し、次の行に移動します (次の行に多数の関数呼び出しが含まれている場合も同様です)。 |
o[ut] |
現在の関数の末尾に移動します。 |
pa[th] [pathName] |
バイナリの場所が使用できない場合に、指定したパスでソース ファイルを検索します。 |
p[rint] [var] | [-d] |
スコープ内のすべての変数の出力 (print)、指定した変数の出力 (print var)、またはデバッガ変数の出力 (print -d) を実行します。 |
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 は、エディット コンティニュ機能を有効にしますが、パフォーマンスに影響します。 |
Set variable=value |
スコープ内の変数の値を変更します。 独自のデバッガ変数を作成し、アプリケーション内から参照値を割り当てることもできます。元の値がスコープの外であっても、これらの値は元の値に対するハンドルとして機能します。すべてのデバッガ変数は、$ で始まる必要があります (例 : $var)。set $var= コマンドを使用して、これらのハンドルに何も設定しないことでハンドルを削除できます。 |
Setip [-il] number |
ファイル内の現在の命令ポインタ (IP: Instruction Pointer) を指定した位置に設定します。-il オプションを指定した場合、数値はメソッド内の中間言語のオフセットを表します。それ以外の場合は、数値はソースの行番号を表します。 |
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 name] |
現在のアクティブ スレッドにニックネームとして name を割り当てます。ニックネームは、スレッド名の代わりに使用できます。ニックネームを数字にすることはできません。現在のスレッドにニックネームが既に割り当てられている場合、古いニックネームは新しいニックネームに置き換えられます。新しいニックネームが "" の場合は、現在のスレッドのニックネームが削除され、新しいニックネームはスレッドに割り当てられません。 thread newThread - アクティブ スレッドに newThread を設定します。newThread には、スレッドのニックネームまたはスレッド番号を指定できます。 thread - 現在のプロセス内のすべてのマネージ スレッドを表示します。 通常、スレッドはスレッド番号で識別されますが、スレッドにニックネームが割り当てられている場合は、スレッド番号ではなくニックネームが表示されます。 |
u[p] |
アクティブなスタック フレームを上に移動します。 |
uwgc[handle] [var] | [address] |
ハンドルによって追跡された変数を出力します。ハンドルは、名前またはアドレスで指定できます。 |
when |
現在アクティブな when ステートメントを表示します。 when delete all |num[num[num...]] - 番号で指定された when ステートメントを削除します。all が指定されている場合は、すべての when ステートメントを削除します。 stopReason[specific_condition] do cmd[cmd[cmd...] ] - stopReason パラメータには、以下を指定できます。 StepComplete、ProcessExited、ThreadCreated、BreakpointHit、ModuleLoaded、ClassLoaded、AssemblyLoaded、AssemblyUnloaded、ControlCTrapped、ExceptionThrown、UnhandledExceptionThrown、AsyncStop、AttachComplete、UserBreak、EvalComplete、EvalException、RemapOpportunityReached、NativeStop。 specific_condition には以下を指定できます。 number - ThreadCreated および BreakpointHit の場合、同じ値を持つスレッド ID 番号とブレークポイント番号によって停止した場合にだけアクションを発生させます。 [!]name - ModuleLoaded、ClassLoaded、AssemblyLoaded、AssemblyUnloaded、ExceptionThrown、および UnhandledExceptionThrown の場合、名前が stopReason の名前と一致する場合にだけアクションを発生させます。 specific_condition は、stopReason の他の値に対しては空であることが必要です。 |
w[here] [-v] [-c depth] [threadID] |
スタック フレームのデバッグ情報を表示します。 -v オプションを指定すると、表示された各スタック フレームの詳細情報が表示されます。 depth に数値を指定すると、表示するフレームの数を制限できます。すべてのフレームを表示するには、all コマンドを使用します。既定値は 100 です。 threadID パラメータを指定すると、スタックに関連付けるスレッドを制御できます。既定値は、現在のスレッドのみです。すべてのスレッドを取得するには、all コマンドを使用します。 |
x [-c numSymbols] [module[!pattern]] |
モジュールの pattern に一致する関数を表示します。 numSymbols を指定すると、出力が指定した数に制限されます。!regex が指定されていない場合、すべての関数が表示されます。module が指定されていない場合は、読み込まれたすべてのモジュールが表示されます。break コマンドを使用してブレークポイントを設定するには、シンボル (~#) を使用します。 |
メモ : |
---|
MDbg.exe コマンドでは、大文字と小文字が区別されます。 |
解説
デバッグするアプリケーションをコンパイルするときは、コンパイラ固有のフラグを使用します。このフラグによって、コンパイラがデバッグ シンボルを生成します。コンパイラ固有のフラグの詳細については、コンパイラのドキュメントを参照してください。最適化したアプリケーションでもデバッグはできますが、一部のデバッグ情報が欠落しています。たとえば、ローカル変数の多くを表示できなくなり、ソース行も不正確になります。
アプリケーションをコンパイルした後、コマンド プロンプトに「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 プロンプトは、デバッガが起動したことを表します。
デバッガが起動したら、コマンドと適切な引数を使用して、必要な機能を呼び出してください。