第二に、文字列のワイルドカード構文
文字列パラメータを持ついくつかのデバッガコマンドは、ワイルドカードの様々なを受け入れます。パラメータのこれらのタイプは、次の文法的な機能をサポートしています。
- アスタリスク(*)は、ゼロ以上の文字を意味します。
- 疑問符(?)は任意の単一文字を表します。
- ([])カッコ内の文字のリストを含むリスト内の任意の1文字を表します。リストには、1文字の一致です。( - )指定された範囲これらのブラケットでは、ハイフンを使用することができます。例えば、PROG [ER-T7は、 "progeam"、 "プログラム"、一致しています "progsam"、 "progtam" 及び"prog7amを"。
- 番号記号(#)は、ゼロ以上の文字ことを示しています。たとえば、lo#pと "LP"、 "LOP"、 "ループ"、 "ループ" などが一致。あなたはまた、そうM [IA] #N及び「MN」、「分」、「男」、「マーン」、「メイン」、「ミアン」、「MIIN」、「miain」等を括弧内のデジタルシンボルの組合せとすることができます試合。
- プラス記号(+)は、1つのまたは複数の文字ことを示しています。例えば、LO PはLO + P同じですが、LO + P "LP" のミスマッチ。同様に、M [IA] + N [IA] N同じ、M [IA] + N及び "MN" ミスマッチを除いてmを有します。?そのAを除いて、B及び* Bを+?Bと "AB" のミスマッチを+。
- あなたは、左ブラケット([)、右角括弧(])、アスタリスク(*)またはプラス記号(+)の文字をテキスト番号記号(#)、疑問符(?)を指定する必要がある場合は、(バックスラッシュ文字を追加する必要があります\ )。あなたは括弧で囲まれたハイフンない場合、ハイフンは常にリテラルです。しかし、テキストは、括弧内のリストにハイフンを指定しません。
0:000 > R EAX = @ebx
x86プロセッサに基づいたマーク
X86ベースのプロセッサは、複数のレジスタと呼ばれるフラグを使用することができます。
登録し、スレッド
第四に、疑似レジスタの文法
擬似レジスタ特定の値を複数記憶するためのデバッガサポート。デバッガは自動的にいくつかの疑似レジスタ有用な値に設定されます。ユーザ定義の疑似レジスタは、整数変数を読み書きされます。すべての疑似レジスタは、ドル記号($)を先頭にしています。あなたはMASM構文を使用している場合は、ドル記号の前に記号(@)で追加することができます。この記号ではなく、シンボルよりも、レジスタまたは擬似レジスタである次のタグでデバッガを伝えます。あなたは記号で省略した場合、それは全体のシンボルテーブルを検索しなければならないため、デバッガの応答は、遅くなります。
例えば、次の2つのコマンドは、同じ出力を生成するが、第2のコマンド速いです。
0:000 >?$ EXP :式評価143 = 0000008f 0:000 >?@ $のexpが 評価の式:143 = 0000008f
同じ名前とシンボルを登録擬似がある場合は、アットマーク(@)を追加する必要があります。あなたがC ++式の構文を使用している場合は、常にアットマーク(@)が必要です。
R(レジスタ)コマンドは、この規則の例外です。デバッガは、常に最初のパラメータレジスタまたは擬似レジスタとして解釈されます。(あなたが必要としないか、@記号で許可されていません。)2番目のパラメータrコマンドがある場合は、デフォルトの表現の構文に従って解釈されます。デフォルト式の構文はC ++の場合は、疑似レジスタ$ $ TlのT2疑似レジスタをコピーするには、次のコマンドを使用する必要があります。
0:000 >のR $ t1の= @ $ t2の
4.1自動擬似レジスタ
デバッガは自動的に次の疑似レジスタを設定します。
疑似レジスタ | 説明 |
---|---|
$それ |
最後の命令の実効アドレスが実行されました。命令が有効なアドレスではない場合、デバッガは「エラーレジスタエラー」と表示されます。この命令は、2つの有効なアドレスを持っている場合は、デバッガは最初のアドレスが表示されます。 |
$ EA2 |
最後の命令の第二の実効アドレスが実行されました。2つの命令が有効なアドレスを持っていない場合、デバッガは「エラーレジスタエラー」と表示されます。 |
$のEXP |
最後の式が評価されます。 |
アウト$ |
スタック上のリターンアドレスが現在置かれています。 このアドレスは、コマンドの実装に特に有用です。例えば、G @ $ RAは引き続き、アドレスを返す(ただし、あなたが見つけるまで(上がる)区は、「シングルステップ」で現在の機能のために、より正確かつ有効な方法です)。 |
$ IP |
命令ポインタレジスタ。 X86ベースのプロセッサ:同じEIP。Itaniumベースのプロセッサ:関連IIP。(詳細については、この表の以下の説明を参照してください)。X64ベースのプロセッサ:同じRIP。 |
$ eventip |
イベント現在の命令ポインタの時。このポインタは、通常と一致する$のIPあなたがスレッドを切り替えたり、手動で命令ポインタの値を変更しない限り、。 |
$ PREVIP |
同時にイベントへの命令ポインタ。(一つのイベントとしてカウントデバッガへの侵入。) |
$ relip |
現在のイベントに関連付けられた命令ポインタ。分岐トラックは、このポインタは、分岐元へのポインタです。 |
$ scopeip |
現在の命令ポインタローカルコンテキスト(別名スコープ)。 |
$ exentry |
現在のプロセスの実行可能ファイルの最初のエントリポイントのアドレス。 |
$ retreg |
メインの戻り値レジスタ。 X86ベースのプロセッサ:同じEAX。Itaniumベースのプロセッサ:同じret0。X64ベースのプロセッサ:同じRAX。 |
$ retreg64 |
64ビットフォーマットメイン戻り値に登録。 x86プロセッサ:同じEDX:EAX右。 |
$のCSP |
現在のコールスタックポインタ。このポインタは、コールスタックの深さレジスタの最も代表的です。 X86ベースのプロセッサ:同じESP。Itaniumベースのプロセッサ:同じBSP。X64ベースのプロセッサ:同じRSP。 |
$ pを |
最後に、の値のDの\ *(表示用メモリ) printコマンド。 |
$ procを |
現在のプロセス(すなわち、アドレスEPROCESSブロック)のアドレス。 |
$スレッド |
現在のスレッドに対応しています。カーネルモードのデバッガでは、このアドレスはブロックETHREADのアドレスです。ユーザーモードでのデバッグは、このアドレスは、スレッド環境ブロック(TEB)アドレスです。 |
$ |
プロセス環境のブロック現在の処理(PEB)アドレス。 |
$のTEB |
現在のスレッドのスレッド環境ブロック(TEB)アドレス。 |
$ TPID |
現在のプロセスは、スレッド、プロセスID(PID)を有します。 |
$時間 |
現在のスレッドのスレッドID。 |
$ DTID |
|
$ DPID |
|
$叫びました |
|
$の塩基対の数 |
ブレークポイントを対応するアドレス。例えば、米国BP3(又はUS BP03は)ブレークポイントのブレークポイント番号3を指します。デジタルは常に10進数です。以下のための任意のブレークポイントのID場合は金額は、$ BPの数がゼロと評価されます。ブレークポイントの詳細については、ブレークポイントを使用しました。 |
$枠 |
現在のフレームのインデックス。このインデックスは、同じフレーム番号である(ローカルコンテキスト提供).frameコマンド。 |
$のdbgtime |
コンピュータ上で実行されている現在の時刻デバッガによります。 |
$ callret |
最後に、関数の戻り値は.call(関数呼び出し)を使用またはお電話/ sの.fnretコマンドを。データ型の$ callretは、戻り値のデータ型です。 |
$削除 |
|
$のEXTIN |
|
$clrex |
|
$lastclrex |
托管仅调试:上一次遇到公共语言运行时 (CLR) 异常对象的地址。 |
$ptrsize |
指针的大小。 在内核模式下,此大小是目标计算机上的指针大小。 |
$pagesize |
在一页上的内存字节数。 在内核模式下,此大小为目标计算机上的页面大小。 |
$pcr |
|
$pcrb |
|
$argreg |
|
$exr_chance |
当前的异常记录的可能性。 |
$exr_code |
当前的异常记录异常代码。 |
$exr_numparams |
当前的异常记录中的参数数量。 |
$exr_param0 |
当前的异常记录中的参数 0 的值。 |
$exr_param1 |
当前的异常记录中的值的参数 1。 |
$exr_param2 |
当前的异常记录中的参数 2 的值。 |
$exr_param3 |
当前的异常记录中的参数 3 的值。 |
$exr_param4 |
当前的异常记录中的参数 4 的值。 |
$exr_param5 |
当前的异常记录中的参数 5 的值。 |
$exr_param6 |
当前的异常记录中的参数 6 的值。 |
$exr_param7 |
当前的异常记录中的值的参数 7。 |
$exr_param8 |
当前的异常记录中的参数 8 的值。 |
$exr_param9 |
当前的异常记录中的值的参数 9。 |
$exr_param10 |
当前的异常记录中的参数 10 的值。 |
$exr_param11 |
当前的异常记录中的参数 11 的值。 |
$exr_param12 |
当前的异常记录中的值的参数 12。 |
$exr_param13 |
当前的异常记录中的值的参数 13。 |
$exr_param14 |
当前的异常记录中的值为 14 个参数。 |
$bug_code |
如果发生了错误检查,这是错误代码。 适用于实时内核模式调试和内核故障转储。 |
$bug_param1 |
如果发生了错误检查,这是参数 1 的值。 适用于实时内核模式调试和内核故障转储。 |
$bug_param2 |
如果发生了错误检查,这是参数 2 的值。 适用于实时内核模式调试和内核故障转储。 |
$bug_param3 |
如果发生了错误检查,这是参数 3 的值。 适用于实时内核模式调试和内核故障转储。 |
$bug_param4 |
如果发生了错误检查,这是参数 4 的值。 适用于实时内核模式调试和内核故障转储。 |
一个包含结构的地址的伪寄存器(比如$线程)、$、$、$和$将根据C++表达式计算器中的适当数据类型进行评估,但不是在表达式求值器中。例如,命令?$teb显示teb的地址,而命令??@$teb显示整个teb结构。有关详细信息,请参见计算表达式。在基于Itanium的处理器上,IIP寄存器是捆绑对齐的,这意味着它指向包含当前指令的捆绑中的插槽0,即使正在执行不同的插槽。所以IIP不是完整的指令指针。$IP伪寄存器是实际的指令指针,包括bundle和slot。其他持有地址指针的伪寄存器($ra、$retreg、$eventip、$previp、$relip和$exentry)的结构与所有处理器上的$ip相同。
您可以使用r命令更改$ip的值。此更改也会自动更改相应的寄存器。当执行恢复时,它将恢复到新的指令指针地址。这个寄存器是唯一可以手动更改的自动伪寄存器。注意:在masm语法中,可以用句点(.)表示$ip伪寄存器。。在此期间之前不添加at符号(@),也不将该期间用作r命令的第一个参数。在C++表达式中不允许使用此语法。自动伪寄存器类似于自动别名。但是,可以将自动别名与别名相关的令牌(如$)一起使用,并且不能将伪寄存器与此类令牌一起使用
4.2、用户定义的伪寄存器
0:000> r $t0 = 7 0:000> r $t1 = 128*poi(MyVar)
0:000> bp $t3 0:000> bp @$t4 0:000> ?? @$t1 + 4*@$t2
除非使用?与R命令一起切换。如果使用此开关,伪寄存器将获取分配给它的任何类型。例如,下面的命令将unicode_string**类型和0x0012ffbc值分配给$t15。
0:000> r? $t15 = * (UNICODE_STRING*) 0x12ffbc
kd> bp /t @$thread nt!ntopenfile
下面的示例执行一个命令,直到寄存器保留指定的值。首先,在名为“eaxstep”的脚本文件中放入以下条件步进代码。
.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }
接下来,发出以下命令。
t "$<eaxstep"
调试器执行一个步骤,然后运行您的命令。在这种情况下,调试器运行脚本,该脚本显示1234或重复该过程。