ランタイム デバッガ (Cordbg.exe)
ランタイム デバッガは、.NET Framework 共通言語ランタイムを対象としたプログラムに含まれるバグの発見と修正について、ツールの販売元とアプリケーション開発者を支援するツールです。このツールは、ランタイム Debug API を使用してデバッグ サービスを提供します。Cordbg.exe のソース コードは、サンプル アプリケーションとして出荷されています。開発者は、このコードを検討することで、デバッグ サービスの使用方法を学習できます。現時点では、Cordbg.exe を使用してもマネージ コードのデバッグしか実行できません。アンマネージ コードのデバッグはサポートされていません。
Cordbg.exe セッションを開始するには、下の構文の 1 行目を使用します。Cordbg.exe セッション内 の (cordbg)
プロンプトで 2 行目を使用します。
cordbg [ProgramName[Program arguments]][optional arguments ]
command [command arguments]
パラメータ
コマンド | 説明 | ||||||
---|---|---|---|---|---|---|---|
ap[pdomainenum] [option] |
現在のプロセスに含まれるすべてのアプリケーション ドメイン、アセンブリ、およびモジュールを列挙します。引数 option を指定しない場合は、現在のプロセスに含まれるすべてのアプリケーション ドメイン、アセンブリ、およびモジュールが一覧表示されます。デタッチまたはアタッチした後で実行を再開するには、go コマンドを指定する必要があります。 引数 option には次のいずれかを指定できます。
|
||||||
as[sociatesource] {s|b breakpoint id} filename |
指定したファイル名を現在のスタック フレーム ポインタ (オプション s) または指定したブレークポイント (オプション b) と関連付けます。 |
||||||
a[ttach] pid |
実行中のプロセスにデバッガをアタッチします。Cordbg.exe は、現在デバッグ対象としているプログラム (存在する場合) を強制終了し、引数 pid で指定されたプロセスへのアタッチを試行します。プロセス識別番号 pid には 10 進形式または 16 進形式を使用できます。 |
||||||
b[reak] [[file:] line number] | [[ class::] function [:offset]] |
ブレークポイントを設定または表示します。引数を指定しない場合は、現在のブレークポイントの一覧が表示されます。指定する場合は、指定した位置にブレークポイントが設定されます。ブレークポイントを設定できるのは、現在のソース ファイル内の行番号、絶対パス指定したソース ファイル内の行番号、またはクラスとオプションのオフセットによって限定したメソッド内です。 ブレークポイントの設定は、1 回のセッションの中で実行される間持続します。break コマンドと同じ方法で、stop コマンドを使用できます。 指定されたブレークポイントの位置とコードをバインドできない場合、ブレークポイントは "アンバウンド" として表示されます。ブレークポイントがアンバウンドということは、ブレークポイント位置の基になるコードがまだ読み込まれていないことを意味します。この状況は、ファイル名やクラス名のスペルの間違い (名前では大文字と小文字が区別されます) などによって発生することがあります。アプリケーションの実行前にブレークポイントを設定した場合も、ブレークポイントはアンバウンドになります。実際のコードが読み込まれたときに、ブレークポイントはバインドされます。デバッガは、モジュールの読み込み時に、すべてのアンバウンド ブレークポイントを自動的にバインドし直そうとします。 |
||||||
ca[tch] [event] |
イベントの種類を一覧表示するか、または指定した種類イベントが発生したときにデバッガを停止します。引数を指定しない場合は、イベントの種類が一覧表示されます。デバッガを停止するイベントの種類には "on" のマーク、無視されるイベントの種類には "off" のマークが付けられます。引数を指定した場合は、指定した種類のイベントが発生するとデバッガが停止します。既定では、処理されない例外イベント (つまり、セカンド チャンス例外) の発生時にだけ、デバッガが停止します。デバッガを停止するイベントの種類は、1 回のセッションの中で実行される間持続されます。デバッガが特定の種類のイベントを無視するようにするには、ignore コマンドを使用します。 引数 event には次のいずれかを使用できます。
|
||||||
conn[ect] machine_name port |
スマート デバイス プロジェクトの場合。 .NET Compact Framework アプリケーションを実行しているリモート デバイスに接続します。
|
||||||
cont [count] |
プログラムを続行します。引数を指定しない場合は、プログラムが 1 回だけ続行されます。引数を指定すると、プログラムは指定した回数だけ続行されます。このコマンドは、クラス読み込みイベント、例外、またはブレークポイントによってデバッガが停止したときにプログラムを続行する場合に便利です。cont コマンドと同じ方法で go コマンドを使用できます。 |
||||||
del[ete] [breakpoint id, ...] |
ブレークポイントを削除します。引数を指定しない場合は、現在のブレークポイントがすべて削除されます。1 つ以上の引数 breakpoint id を指定すると、指定したブレークポイントが削除されます。ブレークポイント識別子を取得するには、break コマンドまたは stop コマンドを使用します。delete コマンドと同じ方法で remove コマンドを使用できます。 |
||||||
de[tach] |
現在のプロセスからデバッガをデタッチします。このプロセスは自動的に続行され、デバッガがアタッチされていないかのように実行されます。 |
||||||
dis[assemble] [0xaddress][{+|-} delta] [line count] |
指定した場合は、現在の命令ポインタまたはアドレスについて、逆アセンブルしたネイティブな命令を表示します。表示される命令数の既定値は 5 です。引数 line count を指定すると、現在の命令ポインタまたはアドレスの前後に、指定した個数の命令が表示されます。最後に指定した line count が、現在のセッションの既定値になります。delta を指定すると、指定した数が現在の命令ポインタまたは指定したアドレスに加算され、そこから逆アセンブルが開始されます。 |
||||||
d[own] [count] |
スタック フレーム ポインタを、調査の目的で現在のフレームによって呼び出されたフレームに向かって、下向きに移動します。引数を指定しない場合、スタック フレーム ポインタは 1 フレームだけ下に移動します。引数を指定すると、スタック フレーム ポインタは指定したフレーム数だけ下に移動します。ソース レベルの情報を利用できる場合は、フレームと対応するソース行が表示されます。このコマンドは、up コマンドと組み合わせて頻繁に使用されます。 |
||||||
du[mp] address [count] |
デバッガのモードに従って、メモリ ブロックを 16 進形式または 10 進形式の出力でダンプします (mode の説明を参照)。引数 address はメモリ ブロックのアドレスです。引数 count はダンプするバイト数です。 |
||||||
ex[it] |
現在のプロセスを停止し、デバッガを終了します。exit コマンドと同じ方法で quit コマンドを使用できます。 |
||||||
f[unceval] [class::] function [ arg0 arg1 ...argn] |
現在のスレッドに関して、指定した関数を評価します。このツールは、新しいオブジェクトを変数 $result に格納しておき、それを以降の評価に使用します。有効な引数は、他の変数、4 バイト整数、および Null、True、False の各定数に限定されます。
|
||||||
g[o] [count] |
cont の説明を参照してください。 |
||||||
h[elp] [command ...] |
指定したコマンドの説明を表示します。引数を指定しない場合は、デバッガ コマンドの一覧が表示されます。help コマンドと同じ方法で ? コマンドを使用できます。 |
||||||
ig[nore] [event] |
イベントの種類を一覧表示するか、または指定したイベントの種類をデバッガに無視させます。引数 event を指定しない場合は、イベントの種類が一覧表示されます。無視されるイベントの種類には "off" のマーク、デバッガを停止するイベントの種類には "on" のマークが付けられます。引数を指定すると、指定した種類のイベントが無視されます。デバッガを停止するイベントの種類を設定するには、catch コマンドを使用します。 引数 event には、次のいずれかのイベントの種類を指定できます。
|
||||||
i[n] [count] |
step の説明を参照してください。 |
||||||
k[ill] |
現在のプロセスを停止します。デバッガは、アクティブな状態を維持して、後続のコマンドを処理します。 |
||||||
l[ist] option |
読み込まれたモジュール、クラス、またはグローバル関数の一覧を表示します。 引数 option には次のいずれかを指定できます。
|
||||||
m[ode] [[mode name {0|1} ] |
各種のデバッガ機能に対応するデバッガのモードを設定または表示します。値を設定するには、mode name を指定し、"on" にするには 1、"off" にするには 0 を指定します。引数を指定しない場合は、現在のモード設定が一覧表示されます。Cordbg.exe の実行中、モードは Windows レジストリに保持されます。詳細については、デバッガの「モード引数」の表を参照してください。 |
||||||
newo[bj] class |
現在のスレッドを使用して新しいオブジェクトを作成します。このツールは、新しいオブジェクトを変数 $result に格納しておき、それを以降の評価に使用します。 |
||||||
newobjnc class |
現在のスレッドを使用して新しいオブジェクトを作成します。ただし、オブジェクトのコンストラクタは実行されません。新しいオブジェクトはゼロに初期化されます。このツールは、新しいオブジェクトを変数 $result に格納しておき、それを以降の評価に使用します。 |
||||||
news[tr] string |
現在のスレッドを使用して新しい文字列を作成します。このツールは、新しいオブジェクトを変数 $result に格納しておき、それを以降の評価に使用します。 |
||||||
n[ext] [count] |
関数呼び出しをステップ オーバーして、次のソース行までプログラムを実行します。引数を指定しない場合は、1 行だけソース行を実行します。引数を指定すると、指定した行数だけソース行が実行されます。next コマンドと同じ方法で so コマンドを使用できます。 |
||||||
ns[ingle] [count] |
関数呼び出しをステップ オーバーして、1 つ以上の命令を実行します。引数を指定しない場合は、1 つの命令が実行されます。引数 count を指定すると、指定した個数の命令が実行されます。 |
||||||
o[ut] [count] |
現在の関数を実行せずに先に進みます。引数を指定しない場合は、現在の関数でステップ アウトが 1 回実行されます。引数を指定すると、指定した回数だけステップ アウトが実行されます。 |
||||||
pa[th] [new path] |
ソース ファイルおよびのデバッグ シンボルの検索に使用されるパスを表示または設定します。引数を指定しない場合は、現在のパスが表示されます。引数 new path を指定すると、そのパスが、ソース ファイルとデバッグ シンボルを検索するための新しいパスになります。このパスは、セッションが終了しても Windows のレジストリの中に保存されます。 |
||||||
p[rint] [variable name] |
1 つ以上のローカル変数をその値と共に表示します。引数を指定しない場合は、すべてのローカル変数とその値が表示されます。引数を指定すると、指定したローカル変数の値だけが表示されます。詳細については、例の「Print コマンドの使用」を参照してください。 |
||||||
pro[cessenum] |
すべてのマネージ プロセスと、各プロセス内のアプリケーション ドメインを列挙します。 |
||||||
q[uit] |
exit の説明を参照してください。 |
||||||
ref[reshsource] [source file] |
指定したソース ファイルのソース コードを再読み込みします。再読み込みされるソース ファイルは、現在実行されているプログラムの一部である必要があります。path コマンドでソース ファイル パスを設定した後、refreshsource コマンドを使用して足りないソース コードを読み込むことができます。 |
||||||
regd[efault] [force] |
既定のジャスト イン タイム (JIT) デバッガを Cordbg.exe に設定します。既に他のデバッガが登録されている場合、このコマンドは何も実行しません。登録済みの JIT デバッガを上書きするには、引数 force を使用します。 |
||||||
reg[isters] |
現在のスレッドのレジスタの内容を表示します。 |
||||||
rem[ove] [breakpoint id, ...] |
delete の説明を参照してください。 |
||||||
re[sume] [~] [tid] |
デバッガを続行するときに、引数 tid で指定したスレッドを再開します。構文 ~ を使用した場合は、指定したスレッドを除くすべてのスレッドが再開されます。引数を指定しない場合、このコマンドは無効です。 |
||||||
r[un] [executable [args]] |
現在のプロセス (存在する場合) を強制終了し、新しいプロセスを起動します。引数 executable を指定しない場合は、前に run コマンドで実行されたプログラムが実行されます。引数 executable を指定すると、オプションとして指定された args を使用して、指定したプログラムが実行されます。Cordbg.exe がクラス読み込みイベント、モジュール読み込みイベント、およびスレッド起動イベントを無視する場合 (既定の状態)、このプログラムは、メイン スレッドの最初の実行可能命令で停止します。 |
||||||
set variable value |
指定した variable の値を指定した value に設定します。この値には、リテラル、または他の変数を使用できます。詳細については、例の「Set コマンドの使用」を参照してください。 |
||||||
setip line number |
line number で指定された行を、次に実行するステートメントとして設定します。 |
||||||
sh[ow] [count] |
ソース コード行を表示します。引数を指定しない場合は、現在のソース コード行の前後 5 行のソース コード行が表示されます。引数を指定すると、現在の行の前後に、指定した数の行が表示されます。最後に指定した count が、現在のセッションの既定値になります。 |
||||||
si [<count>] |
step の説明を参照してください。 |
||||||
so [<count>] |
next の説明を参照してください。 |
||||||
ss[ingle] [count] |
1 つ以上の命令を実行します。関数呼び出しにステップ インします。引数を指定しない場合は、命令が 1 つだけ実行されます。引数を指定すると、指定した数のステップが実行されます。 |
||||||
s[tep] [count] |
次のソース行までプログラムを実行します。関数呼び出しにステップ インします。引数を指定しない場合、プログラムは次のソース行まで進みます。引数を指定すると、プログラムは指定した行数だけ進みます。step コマンドと同じ方法で si コマンドまたは in コマンドを使用できます。 |
||||||
stop [[file:] line number] | [[class::] function[:offset]] | [=0xaddress] |
break の説明を参照してください。 |
||||||
su[spend] [~] [tid] |
デバッガを続行するときに、引数 tid によって指定したスレッドを一時停止します。構文 ~ を使用した場合は、指定したスレッドを除くすべてのスレッドが一時停止されます。引数を指定しない場合、このコマンドは無効です。 |
||||||
t[hreads] [tid] |
スレッドを一覧表示するか、または現在のスレッドを設定します。引数を指定しない場合は、まだ有効な、マネージ コードを実行していたすべてのスレッドが表示されます。引数を指定すると、現在のスレッドを指定したスレッドに設定します。 |
||||||
up [count] |
スタック フレーム ポインタを、調査目的のため現在のフレームを呼び出したフレームへと上向きに移動します。引数を指定しない場合、スタック フレーム ポインタは 1 フレーム分上に移動します。引数を指定すると、スタック フレーム ポインタは指定したフレーム数だけ上に移動します。ソース レベルの情報を利用できる場合は、フレームと対応するソース行が表示されます。 |
||||||
w[here] [count] |
現在のスレッドのスタック トレースを表示します。引数を指定しない場合は、完全なスタック トレースが表示されます。引数を指定すると、指定した個数のスタック フレームが表示されます。 |
||||||
wr[itememory] address count byte, ... |
指定したバイト数を対象のプロセスに書き込みます。引数 address は、データを書き込む場所を指定します。引数 count は、書き込むバイト数を指定します。引数 byte は、プロセスに書き込む対象を指定します。一覧内のバイト数が引数 count の値よりも小さい場合は、一覧を折り返し、再度コピーします。一覧内のバイト数が引数 count の値よりも多い場合、余分なバイト数は無視されます。 |
||||||
wt |
アプリケーションをネイティブな命令単位で実行します。現在の命令から開始して、コール ツリーを表示しながら実行して行きます。各関数で実行されたネイティブな命令の数、およびコール トレースが表示されます。コマンドの呼び出し元の関数と対応するリターン命令に到達すると、トレースが停止します。トレースの終了時点で、実行された命令の合計数が表示されます。このコマンドは、NT の Symbolic Debugger の wt コマンドによく似たコマンドで、基本的な性能の分析を行うために使用できます。現時点では、マネージ コードだけがカウントされます。 |
||||||
x modulename ! string_to_look_for |
指定したモジュールの中で、引数 string_to_look_for で指定したパターンと一致するシンボルを表示します。引数 string_to_look_for でアスタリスク (*) 文字を指定すると、すべてのシンボルを検索できます。* 文字の後ろの文字は無視されます。 |
||||||
? [command ...] |
help の説明を参照してください。 |
||||||
> filename |
実行されたすべてのコマンドを指定した filename に書き込みます。filename を指定しない場合は、ファイルへのコマンドの書き込みが停止します。 |
||||||
< filename |
指定した filename からコマンドを読み込んで実行します。 |
メモ : |
---|
Cordbg.exe コマンドでは、大文字と小文字が区別されます。また、同義語のコマンドもあります。その場合は、どのコマンドを使用しても同じ結果が得られます。たとえば、break コマンドと stop コマンドのどちらを使用しても、ブレークポイントを設定できます。 |
モード引数
モード引数を指定するには、モードが重複しないようにするために必要な最小の文字数を指定します。たとえば、"モード m 1" は、"mode moduleloads 1" と同じです。
引数 | 説明 |
---|---|
AppDomainLoads |
アプリケーション ドメインとアセンブリ読み込みイベントを表示します。 |
ClassLoads |
クラス読み込みイベントを表示します。 |
DumpMemoryInBytes |
メモリの内容をバイト型または DWORDS 型として表示します。 |
EmbededCLR |
スマート デバイス上で実行している目的の .NET Compact Framework アプリケーションに対して、デバッガを設定します。この設定をオンにするには 1 を、オフにするには 0 を指定します。 |
EnhanceDiag |
拡張診断情報を表示します。 |
HexDisplay |
数値を 16 進形式または 10 進形式で表示します。 |
ILNatPrint |
オフセットを Microsoft Intermediate Language (MSIL)、ネイティブな相対言語、またはその両方で表示します。 |
ISAll |
すべてのインターセプタをステップ実行します。 |
ISClinit |
クラス初期化子をステップ実行します。 |
ISExceptF |
例外フィルタをステップ実行します。 |
ISInt |
ユーザー インターセプタをステップ実行します。 |
ISPolicy |
コンテキスト ポリシーをステップ実行します。 |
ISSec |
セキュリティ インターセプタをステップ実行します。 |
JitOptimizations |
JIT コンパイルで、デバッグしやすいコードを生成するかどうかを指定します。 |
LoggingMessages |
マネージ コードのログ メッセージを表示します。 |
ModuleLoads |
モジュール読み込みイベントを表示します。 |
SeparateConsole |
デバッグ対象のプロセスが、専用のコンソールを取得するかどうかを指定します。 |
ShowArgs |
スタック トレース内のメソッド引数を表示します。 |
ShowModules |
スタック トレース内のモジュール名を表示します。 |
ShowStaticsOnPrint |
オブジェクトの静的フィールドを表示します。 |
ShowSuperClassOnPrint |
オブジェクトの基本クラスの内容を表示します。 |
USAll |
すべての割り当てられていない停止位置をステップ実行します。 |
USEpi |
メソッド エピローグをステップ実行します。 |
USPro |
メソッド プロローグをステップ実行します。 |
USUnmanaged |
アンマネージ コードをステップ実行します。 |
解説
デバッグするアプリケーションをコンパイルするときは、コンパイラ固有のフラグを使用します。そのフラグによって、コンパイラがデバッグ シンボルを生成します。コンパイラ固有のフラグの詳細については、コンパイラのドキュメントを参照してください。最適化したアプリケーションでもデバッグはできますが、一部のデバッグ情報が欠落しています。たとえば、ローカル変数の多くを表示できなくなり、ソース行も不正確になります。
アプリケーションをコンパイルした後、コマンド プロンプトに「cordbg」と入力してデバッグ セッションを開始します。例を次に示します。
D:\Program Files\FrameworkSDK\Bin>cordbg
Microsoft (R) Common Language Runtime Test Debugger Shell. Version 2000.14.2100.0, Copyright (c) Microsoft Corp. 1998-2000
(cordbg)
(cordbg)
プロンプトは、デバッガが起動したことを表します。
デバッガが起動したら、コマンドと適切な引数を使用して、必要な機能を呼び出してください。
コマンド行でデバッグ セッションを開始する場合は、デバッグするアプリケーションの名前、プログラム引数、およびオプションの引数も指定できます。Cordbg.exe のオプション引数は、Cordbg.exe の実行中に使用するのと同じコマンドですが、プリフィックスとして感嘆符 (!) 文字を付ける必要があります。文字列の中で ! 文字をリテラルとして使用するには、プリフィックスとして円記号 (\) 文字を付けます。これは、x コマンドを使用するときに必要です。
コマンドに対する数値引数が 0x というプリフィックスで始まる場合、Cordbg.exe は引数が 16 進形式であると見なします。それ以外の場合は、引数を 10 進形式と見なします。
Cordbg.exe のほとんどのコマンドの前には、アスタリスク (*) を付けることができます。アスタリスクを付けたコマンドは、プロセス内のマネージ スレッドごとに 1 回ずつ実行されます。このコマンドは、各スレッドのコンテキスト内で実行されます。アスタリスクを付けることによって最も役立つコマンドは、w[here] コマンドです。たとえば、*w によって、すべてのマネージ スレッドのスタック トレースが出力されます。
ランタイムのデバッグ サービスの詳細については、「アプリケーションのデバッグとプロファイリング」を参照してください。また、ツールの開発者は、.NET Framework SDK に同梱される Tools Developers Guide フォルダ内の「Debug Overview」および「Debug Reference」を参照する必要があります。
例
Cordbg.exe セッションの開始
次のコマンドでは、アプリケーション MyApplication.exe について、プログラム引数 a
と 2
を使用して Cordbg.exe セッションを開始します。さらに、オプション コマンドとして、MyApplication.cs の行番号 42 にブレークポイントを設定し、アプリケーションを続行し、文字列 'SomeString'
と一致する MyApplication.exe 内のシンボルを表示します。 `` ``
cordbg MyApplication.exe a 2 !b MyApplication.cs:42 !g !x MyApplication.exe\!SomeString
Cordbg.exe セッション内での実行可能ファイルの実行
Cordbg.exe セッション内で ((cordbg)
プロンプトに対して) 次のコマンドを入力すると、プログラム引数 a
と 2
を使用して実行可能ファイル MyApplication.exe が実行されます。
run MyApplication.exe a 2
print コマンドの使用
print コマンドでドット表記を使用すると、オブジェクト内の変数を指定できます。次にそのコマンドの例を示します。
print obj.var1
print obj1.obj2.var1
あるクラスが他のクラスを拡張する場合に print コマンドを実行すると、指定したクラスのフィールドと基本クラスのフィールドの両方が表示されます。たとえば、クラス m1
にフィールド a
、b
、および c
があり、m1
を拡張するクラス m2
にフィールド d
、e
、および f
がある場合、m2
のインスタンス myInstance
は次のように表示されます。
myInstance = <addr> <m2>
a = 1
b = 2
c = 3
m2::d = 4
m2::e = 5
m2::f = 6
クラス静的変数を指定するには、変数名にプリフィックスとしてクラス名を付けます。次にその例を示します。
print MyClass::StaticVar1
print System::Boolean::True
配列インデックスは単純な式にする必要があります。print コマンドとの使用に有効な配列インデックスを次に示します。
print arr[1]
print arr[i]
print arr1[arr2[1]]
print md[1][5][myObject.a]
次の配列インデックスは単純な式ではないため、print コマンドと一緒には使用できません。
print arr[i + 1]
print arr[i + 2]
set コマンドの使用
set コマンドを使用する場合は、指定した変数に代入する値として、リテラル、または他の変数を使用できます。set コマンドの使用方法として有効な例を次に示します。
set int1 0x2a
set float1 3.1415
set char1 'a'
set bool1 true
set obj1 0x12345678
set obj1 obj2
set obj1.m_length[obj1.m_height] obj3.m_length[2]