シリーズWindbgのコマンドの構文規則(B)

第二に、文字列のワイルドカード構文

文字列パラメータを持ついくつかのデバッガコマンドは、ワイルドカードの様々なを受け入れます。パラメータのこれらのタイプは、次の文法的な機能をサポートしています。

  •  アスタリスク(*)は、ゼロ以上の文字を意味します。
  • 疑問符(?)は任意の単一文字を表します。
  • ([])カッコ内の文字のリストを含むリスト内の任意の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" のミスマッチを+。
  • あなたは、左ブラケット([)、右角括弧(])、アスタリスク(*)またはプラス記号(+)の文字をテキスト番号記号(#)、疑問符(?)を指定する必要がある場合は、(バックスラッシュ文字を追加する必要があります\ )。あなたは括弧で囲まれたハイフンない場合、ハイフンは常にリテラルです。しかし、テキストは、括弧内のリストにハイフンを指定しません。
パラメータは、いくつかの追加機能をサポートしています。また、シンボルを指定します。 標準の文字列のワイルドカード文字に加えて、記号を指定するために使用されるテキスト式の前にアンダースコア(_)を使用することができます。この式及び記号マッチング場合、デバッガはアンダースコア、またはゼロの任意の数として見下線であろう。シンボルに一致する場合にのみ、この機能が動作します。これは、一般的に、文字列のワイルドカード式には適用されません。
第三に、文法を登録
デバッガは、制御および浮動小数点レジスタができます。式レジスタに使用される場合、前にレジスタマーク(@)で添加されるべきです。このシンボルは、レジスタの名前である次のテキストでデバッガに指示します。あなたはMASM式の構文を使用している場合は、レジでいくつかの非常に一般的な記号を省略することができます。x86ベースのシステムでは、EIPとEFLシンボルレジスタに、EAX、EBX、ECX、EDX、ESI、EDI、EBPを省略してもよいです。しかし、あまり一般的レジスタ、あなたは16進数としてテキストの解釈の最初の試みの兆候でデバッガを指定した場合。テキストのテキストは、16進数以外の文字が含まれている場合、デバッガ次の解釈のシンボルとして。デバッガは、シンボルの一致を見つけることができない場合は最後に、デバッガは、レジスタとしてテキストを解釈します。あなたがC ++式の構文を使用している場合、あなたは常にAT-シンボルを必要としています。
R(レジスタ)コマンドは、この規則の例外です。デバッガは、常にその最初のパラメータレジスタとして解釈されます。(サインで要求または許可。)第2のパラメータRコマンドは、デフォルトの式の構文に応じて解釈される場合。 デフォルト式の構文はC ++の場合は、EAXレジスタにEBXレジスタをコピーするには、次のコマンドを使用する必要があります。
0000 > R EAX = @ebx

x86プロセッサに基づいたマーク

X86ベースのプロセッサは、複数のレジスタと呼ばれるフラグを使用することができます。

登録し、スレッド

各スレッドは、独自のレジスタ値を持っています。 メモリ内の別のスレッドで実行されたときにこれらの値は、CPUレジスタ内のスレッドの実行に格納されています。 ユーザ・モードでは、任意の参照は、現在のスレッドのレジスタに関連付けられたレジスタとして解釈されます。現在のスレッドの詳細については、制御プロセスとスレッドを参照してください。 カーネル・モードでは、任意の基準レジスタは、現在のコンテキスト・レジスタに関連付けられたレジスタとして解釈されます。登録は、特定のスレッドコンテキスト、コンテキストレコードまたはトラップフレームに一致するように設定することができます。あなただけの最も重要なレジスタは、レジスタコンテキスト固有である表示することができ、それらの値を変更することはできません。

第四に、疑似レジスタの文法

擬似レジスタ特定の値を複数記憶するためのデバッガサポート。デバッガは自動的にいくつかの疑似レジスタ有用な値に設定されます。ユーザ定義の疑似レジスタは、整数変数を読み書きされます。すべての疑似レジスタは、ドル記号($)を先頭にしています。あなたはMASM構文を使用している場合は、ドル記号の前に記号(@)で追加することができます。この記号ではなく、シンボルよりも、レジスタまたは擬似レジスタである次のタグでデバッガを伝えます。あなたは記号で省略した場合、それは全体のシンボルテーブルを検索しなければならないため、デバッガの応答は、遅くなります。

例えば、次の2つのコマンドは、同じ出力を生成するが、第2のコマンド速いです。

0000 >?$ EXP 
:式評価143 = 0000008f
 0000 >?@ $のexpが
評価の式:143 = 0000008f

同じ名前とシンボルを登録擬似がある場合は、アットマーク(@)を追加する必要があります。あなたがC ++式の構文を使用している場合は、常にアットマーク(@)が必要です。

 R(レジスタ)コマンドは、この規則の例外です。デバッガは、常に最初のパラメータレジスタまたは擬似レジスタとして解釈されます。(あなたが必要としないか、@記号で許可されていません。)2番目のパラメータrコマンドがある場合は、デフォルトの表現の構文に従って解釈されます。デフォルト式の構文はC ++の場合は、疑似レジスタ$ $ TlのT2疑似レジスタをコピーするには、次のコマンドを使用する必要があります。

0000 >のR $ t1の= @ $ t2の

4.1自動擬似レジスタ

デバッガは自動的に次の疑似レジスタを設定します。

疑似レジスタ 説明

$それ

最後の命令の実効アドレスが実行されました。命令が有効なアドレスではない場合、デバッガは「エラーレジスタエラー」と表示されます。この命令は、2つの有効なアドレスを持っている場合は、デバッガは最初のアドレスが表示されます。

$ EA2

最後の命令の第二の実効アドレスが実行されました。2つの命令が有効なアドレスを持っていない場合、デバッガは「エラーレジスタエラー」と表示されます。

$のEXP

最後の式が評価されます。

アウト$

スタック上のリターンアドレスが現在置かれています。

このアドレスは、コマンドの実装に特に有用です。例えば、G @ $ RAは引き続き、アドレスを返す(ただし、あなたが見つけるまで(上がる)区は、「シングルステップ」で現在の機能のために、より正確かつ有効な方法です)。

$ IP

命令ポインタレジスタ。

X86ベースのプロセッサ:同じEIPItaniumベースのプロセッサ:関連IIP(詳細については、この表の以下の説明を参照してください)。X64ベースのプロセッサ:同じRIP

$ eventip

イベント現在の命令ポインタの時。このポインタは、通常と一致する$のIPあなたがスレッドを切り替えたり、手動で命令ポインタの値を変更しない限り、。

$ PREVIP

同時にイベントへの命令ポインタ。(一つのイベントとしてカウントデバッガへの侵入。)

$ relip

現在のイベントに関連付けられた命令ポインタ。分岐トラックは、このポインタは、分岐元へのポインタです。

$ scopeip

現在の命令ポインタローカルコンテキスト(別名スコープ)。

$ exentry

現在のプロセスの実行可能ファイルの最初のエントリポイントのアドレス。

$ retreg

メインの戻り値レジスタ。

X86ベースのプロセッサ:同じEAXItaniumベースのプロセッサ:同じret0X64ベースのプロセッサ:同じRAX

$ retreg64

64ビットフォーマットメイン戻り値に登録。

x86プロセッサ:同じEDX:EAX右。

$のCSP

現在のコールスタックポインタ。このポインタは、コールスタックの深さレジスタの最も代表的です。

X86ベースのプロセッサ:同じESPItaniumベースのプロセッサ:同じBSPX64ベースのプロセッサ:同じ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 的值。 适用于实时内核模式调试和内核故障转储。

在某些调试场景中,这些伪寄存器中的一些可能不可用。例如,在调试用户模式小型转储或某些内核模式转储文件时,不能使用$peb、$tid和$tpid。在某些情况下,您可以从~(thread status)而不是$tid学习线程信息。不能在第一个调试器事件上使用$previp伪寄存器。除非是分支跟踪,否则不能使用$relip伪寄存器。如果使用不可用的伪寄存器,则会出现语法错误。

 一个包含结构的地址的伪寄存器(比如$线程)、$、$、$和$将根据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、用户定义的伪寄存器

有20个用户定义的伪寄存器($t0、$t1、…$t19)。 这些伪寄存器是可以通过调试器读写的变量。您可以在这些伪寄存器中存储任何整数值。它们作为循环变量尤其有用。 若要写入到一个这些伪寄存器,使用 r (寄存器) 命令,如以下示例所示。
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
  启动调试器时,用户定义的伪寄存器使用零作为默认值。 注意,别名$u0、$u1、…$u9不是伪寄存器,尽管它们的外观相似。
4.3、示例
下面的示例设置了当前线程调用每次命中的断点NtOpenFile但在其他线程调用时,则不会命中此断点NtOpenFile
kd> bp /t @$thread nt!ntopenfile

下面的示例执行一个命令,直到寄存器保留指定的值。首先,在名为“eaxstep”的脚本文件中放入以下条件步进代码。

.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }

接下来,发出以下命令。

t "$<eaxstep"

调试器执行一个步骤,然后运行您的命令。在这种情况下,调试器运行脚本,该脚本显示1234或重复该过程。

おすすめ

転載: www.cnblogs.com/yilang/p/11411467.html