エイリアスの使用

エイリアスは、自動的に他の文字列に置き換えられる文字列です。 これらをデバッガ コマンドで使用すると、特定の一般的なフレーズの再入力を避けることができます。

エイリアスは、エイリアス名同等のエイリアスで構成されます。 デバッガ コマンドの一部としてエイリアス名を使用すると、その名前は同等のエイリアスに自動的に置き換えられます。 この置換は、コマンドが解析または実行される前に即座に行われます。

デバッガは 3 種類のエイリアスをサポートしています。

  • ユーザー名付きのエイリアスを設定して名前を付けることができます。

  • 固定名のエイリアスを設定できますが、その名前は $u0$u1、...、$u9 になります。

  • デバッガーは自動エイリアスを設定し、名前を付けます。

ユーザー名付きエイリアスの定義

ユーザー名付きのエイリアスを定義する場合、エイリアス名と同等のエイリアスを選択できます。

  • エイリアス名には、空白を含まない任意の文字列を使用できます。

  • 同等のエイリアスには任意の文字列を使用できます。 キーボードで入力する場合、同等のエイリアスに先頭のスペースやキャリッジ リターンを含めることはできません。 あるいは、メモリ内の文字列、数値式の値、ファイルの内容、環境変数の値、または 1 つ以上のデバッガ コマンドの出力と等しく設定することもできます。

エイリアス名と同等のエイリアスはどちらも大文字と小文字が区別されます。

ユーザー名付きのエイリアスを定義または再定義するには、as (エイリアスの設定) または aS (エイリアスの設定) コマンドを使用します。

エイリアスを削除するには、ad (エイリアスの削除) コマンドを使用します。

現在のユーザー名付きエイリアスをすべてリストするには、al (List Aliases)コマンドを使用します。

固定名のエイリアスの定義

固定名のエイリアスは 10 個あります。 それらのエイリアス名は $u0$u1、...、$u9 です。 それらのエイリアスに相当するものは、ENTER キーストロークを含まない任意の文字列です。

R (レジスタ) コマンドを使用して、固定名のエイリアスに相当するエイリアスを定義します。 固定名のエイリアスを定義する場合は、文字「u」の前にピリオド (.) を挿入する必要があります。 等号 (=) の後のテキストは、エイリアスと同等です。 同等のエイリアスにはスペースまたはセミコロンを含めることができますが、先頭と末尾のスペースは無視されます。 同等のエイリアスを引用符で囲まないでください (結果に引用符が必要な場合を除く)。

固定名のエイリアスに r (レジスタ) コマンドを使用する場合は、混乱しないでください。 これらのエイリアスは、r コマンドを使用して同等のエイリアスを設定しても、レジスターまたは疑似レジスターではありません。 これらのエイリアスの前にアットマーク (@) を追加する必要はありません。また、r コマンドを使用してこれらのエイリアスのいずれかの値を表示することはできません。

デフォルトでは、固定名のエイリアスを定義しない場合、それは空の文字列になります。

自動エイリアス

デバッガーは次の自動エイリアスを設定します。

エイリアス名 同等のエイリアス

$ntnsym

コンピュータのネイティブ アーキテクチャ上の NT シンボルに最も適したモジュール。 このエイリアスは、ntdll または nt のいずれかに等しくなります。

$ntwsym

WOW64 を使用する 32 ビット デバッグ中の NT シンボルに最適なモジュール。 このエイリアスは、ntdll32 または Ntdll.dll の他の 32 ビット バージョンである可能性があります。

$ntsym

現在のマシン モードに一致する NT シンボルに最も適したモジュール。 ネイティブ モードでデバッグしている場合、このエイリアスは $ntnsym と同じです。 非ネイティブ モードでデバッグしている場合、デバッガーはこのモードに一致するモジュールを見つけようとします。 (たとえば、WOW64 を使用する 32 ビット デバッグ中、このエイリアスは $ntwsym と同じになります。)

$CurrentDumpFile

デバッガーが最後にロードしたダンプ ファイルの名前。

$CurrentDumpPath

デバッガーが最後にロードしたダンプ ファイルのディレクトリ パス。

$CurrentDumpArchiveFile

デバッガーが最後にロードしたダンプ アーカイブ ファイル (CAB ファイル) の名前。

$CurrentDumpArchivePath

デバッガーが最後にロードしたダンプ アーカイブ ファイル (CAB ファイル) のディレクトリ パス。

自動エイリアスは自動擬似レジスタと似ていますが、エイリアス関連のトークン (${ } など) では自動エイリアスを使用できるのに対し、これらのトークンでは擬似レジスタを使用できない点が異なります。

デバッガーコマンドウィンドウでのエイリアスの使用

エイリアスを定義した後は、任意のコマンド エントリでそのエイリアスを使用できます。 エイリアス名は、同等のエイリアスに自動的に置き換えられます。 したがって、エイリアスを式またはマクロとして使用できます。

エイリアス名は引用符で囲まれていても正しく展開されます。 同等のエイリアスには任意の数の引用符またはセミコロンを含めることができるため、同等のエイリアスは複数のコマンドを表すことができます。

ユーザー名付きのエイリアスは、その名前が他の文字と空白で区切られている場合にのみ認識されます。 エイリアスの最初の文字は、行の先頭か、スペース、セミコロン、または引用符の後に置く必要があります。 エイリアスの最後の文字は行を終了するか、その後にスペース、セミコロン、または引用符が続く必要があります。

「デバッガー コマンド」ウィンドウに入力した「as」、「aS」、「ad」、または「al」で始まるテキストは、エイリアス置換を受けません。 この制限により、エイリアス コマンドが動作不能になるのを防ぎます。 ただし、この制限は、行の ad または alに続くコマンドのエイリアスが置換されないことも意味します。 これらの文字列のいずれかで始まる行でエイリアスを置き換える場合は、エイリアスの前にセミコロンを追加します。

ただし、${ }トークンを使用すると、他のテキストの隣にある場合でも、ユーザー名付きのエイリアスを展開できます。 このトークンを特定のスイッチと併用して、エイリアスが展開されないようにしたり、特定のエイリアス関連の値を表示したりすることもできます。 これらの状況の詳細については、「${ } (エイリアス インタプリタ)」を参照してください。

固定名のエイリアスは、行のテキスト内にどのように埋め込まれているかに関係なく、行内のどの位置からも正しく展開されます。

WinDbg.(open.write_cmd_hist(コマンド履歴の書き込み).lsrcpath、および.lsrcfix )でのみ使用可能なコマンドと、いくつかの追加コマンド(.hh.cls.wtitle.remote 、カーネルモード .restart、およびユーザーモード.restart)とエイリアスを使用します。

スクリプトファイルでのエイリアスの使用

スクリプト ファイルでエイリアスを使用する場合は、そのエイリアスが適切なタイミングで展開されるように特別な注意を払う必要があります。 次のスクリプトを考えてみましょう。

.foreach (value {dd 610000 L4})
{
   as /x ${/v:myAlias} value + 1
   .echo value myAlias
}

ad myAlias

ループを初めて実行するとき、as, aS (エイリアスの設定) コマンドは、エイリアスに値を割り当てます。 myAlias に割り当てられる値は、1 に 610000 を加えたものです (dd コマンドの最初の出力)。 ただし、.echo (エコー コメント) コマンドを実行すると、myAlias はまだ展開されていないため、610001 ではなく、「myAlias」というテキストが表示されます。

0:001> $$>< c:\Script02.txt
00610000 myAlias
00905a4d 0x610001
00000003 0x905a4e
00000004 0x4
0000ffff 0x5

問題は、コードの新しいブロックが入力されるまで myAlias が展開されないことです。 ループの次のエントリは新しいブロックであるため、myAlias は 610001 に展開されます。 ただし、.echo (エコー コメント) コマンドを実行すると、myAlias はまだ展開されていないため、610001 ではなく、「myAlias」というテキストが表示されます。

.foreach (value {dd 610000 L4}) 
{
   as /x ${/v:myAlias} value + 1
   .block{.echo value myAlias}
}

ad myAlias

変更されたスクリプトを使用すると、次の正しい出力が得られます。

0:001> $$>< c:\Script01.txt
00610000 0x610001
00905a4d 0x905a4e
00000003 0x4
00000004 0x5
0000ffff 0x10000

詳細については、「.block および ${ } (エイリアス インタプリタ)」を参照してください

エイリアスでの.foreachトークンの使用

エイリアスの定義で .foreachトークンを使用する場合はトークンが展開されるように特別な注意を払う必要があります。 次の一連のコマンドを考えてみましょう。

r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {as myAlias Token}
al

最初のコマンドは、$t0 疑似レジスタの値を 5 に設定します。 2 番目のコマンドは、以前に myAlias に割り当てられていた可能性のある値をすべて削除します。 3 番目のコマンドは、?$@t0 コマンドの 3 番目のトークンを取得し、そのトークンの値を myAlias に割り当てようとします。 4 番目のコマンドは、すべてのエイリアスとその値をリストします。 myAlias の値は 5 であると予想されますが、代わりに値は「Token」という単語になります。

   Alias            Value  
 -------          ------- 
 myAlias          Token 

問題は、as コマンドが.foreach ループ本体の行の先頭にあることです。 行が as コマンドで始まる場合、その行のエイリアスとトークンは展開されません。 As コマンドの前にセミコロンまたは空白スペースを置くと、すでに値を持つエイリアスまたはトークンが展開されます。 この例では、myAlias にはまだ値がないため展開されません。 トークンの値は 5 であるため、展開されます。 以下は、同じコマンドのシーケンスに as コマンドの前にセミコロンを追加したものです

r $t0 = 5
ad myAlias
.foreach /pS 2 /ps 2 (Token {?@$t0}) {;as myAlias Token}
al

これで、期待どおりの出力が得られます。

  Alias            Value  
 -------          ------- 
 myAlias          5 

再帰的なエイリアス

固定名のエイリアスは、任意のエイリアスの定義で使用できます。 固定名のエイリアスの定義でユーザー名付きのエイリアスを使用することもできます。 ただし、別のユーザー名付きエイリアスの定義でユーザー名付きエイリアスを使用するには、asまたは aS コマンドの前にセミコロンを追加する必要があります。そうしないと、その行でエイリアスの置換は行われません。

このタイプの再帰的定義を使用している場合、各エイリアスは使用されるとすぐに変換されます。 次の例では 7 ではなく 3 が表示されます

0:000> r $.u2=2 
0:000> r $.u1=1+$u2 
0:000> r $.u2=6 
0:000> ? $u1 
Evaluate expression: 3 = 00000003

たとえば、同様に、次の例では 7 ではなく 3 が表示されます

0:000> as fred 2 
0:000> r $.u1= 1 + fred 
0:000> as fred 6 
0:000> ? $u1 
Evaluate expression: 3 = 00000003

次の例も許可され、9 が表示されます。

0:000> r $.u0=2 
0:000> r $.u0=7+$u0 
0:000> ? $u0
Evaluate expression: 9 = 00000009

エイリアスの例

次の例のように、エイリアスを使用すると、長いシンボル名や複雑なシンボル名を入力する必要がなくなります。

0:000> as Short usersrv!NameTooLongToWantToType
0:000> dw Short +8

次の例は前の例に似ていますが、固定名のエイリアスを使用しています。

0:000> r $.u0=usersrv!NameTooLongToWantToType
0:000> dw $u0+8

頻繁に使用するコマンドのマクロとしてエイリアスを使用できます。 次の例では、eax レジスタと ebx レジスタを 2 回インクリメントします。

0:000> as GoUp r eax=eax+1; r ebx=ebx+1
0:000> GoUp
0:000> GoUp

次の例では、エイリアスを使用してコマンドの入力を簡素化しています。

0:000> as Cmd "dd esp 14; g"
0:000> bp MyApi Cmd 

次の例は前の例に似ていますが、固定名のエイリアスを使用しています。

0:000> r $.u5="dd esp 14; g"
0:000> bp MyApi $u5 

前述の例は両方とも、次のコマンドと同等です。

0:000> bp MyApi "dd esp 14; g"

Tools.ini ファイル

CDB (および NTSD) では、tools.iniファイルで固定名のエイリアスを事前定義できます。 固定名のエイリアスを事前定義するには、次の例のように、必要な $u フィールドを [NTSD] エントリに追加します

[NTSD]
$u1:_ntdll!_RtlRaiseException
$u2:"dd esp 14;g"
$u9:$u1 + 42

Tools.ini ファイルにユーザー名付きのエイリアスを設定することはできません。

固定名のエイリアスとユーザー名付きのエイリアス

ユーザー名のエイリアスは、固定名のエイリアスよりも使いやすいです。 これらの定義構文はより単純で、al (List Aliases) コマンドを使用してリストすることができます。

固定名のエイリアスが他のテキストの隣で使用されている場合、それらは置き換えられます。 ユーザー名付きのエイリアスが他のテキストの隣にあるときに置換されるようにするには、それを ${ }(エイリアス インタプリタ)トークンで囲みます。

固定名のエイリアスの置換は、ユーザー名によるエイリアスの置換の前に行われます。