使用別名
別名 是會自動取代為其他字元字串的字元字串。 您可以在調試程式命令中使用它們,並避免重新套用特定的常見片語。
別名是由別名名稱和對等別名所組成。 當您使用別名名稱做為調試程式命令的一部分時,該名稱會自動由別名對等專案取代。 此取代會在剖析或執行命令之前立即發生。
除錯程式支援三種別名:
您可以設定和命名 使用者具名別名。
您可以設定 固定名稱別名,但它們命名 為 $u 0, $u 1,..., $u 9。
調試程式會設定和命名 自動別名。
定義 User-Named 別名
當您定義使用者命名別名時,可以選擇別名名稱和對等別名:
別名名稱可以是不包含空格符的任何字串。
別名對等專案可以是任何字串。 如果您在鍵盤上輸入它,則別名對等專案不能包含前置空格或歸位字元。 或者,您可以將它設定為等於記憶體中的字串、數值表達式的值、檔案的內容、環境變數的值,或一或多個調試程式命令的輸出。
別名名稱和對等的別名都會區分大小寫。
若要定義或重新定義使用者命名的別名,請使用 作為 (Set Alias) 或 aS (Set Alias) 命令。
若要移除別名,請使用 廣告 (刪除別名) 命令。
若要列出所有目前的使用者具名別名,請使用 al (List Aliases) 命令。
定義 Fixed-Name 別名
有10個固定名稱別名。 其別名名稱 $u 0、 $u 1、...、 $u 9。 其別名對等專案可以是不包含 ENTER 按鍵的任何字串。
使用 r (Registers) 命令來定義固定名稱別名的別名對等專案。 當您定義固定名稱別名時,必須在字母 「u」 前面插入句點 (。) 。 等號之後的文字 (=) 是對等的別名。 對等別名可以包含空格或分號,但會忽略前置和尾端空格。 除非您要在結果中加上引號) ,否則請勿將別名括在引號 (中。
注意 請勿使用 r (Registers) 命令來混淆固定名稱別名。 這些別名不是緩存器或虛擬緩存器,即使您使用 r 命令來設定其別名對等專案也一樣。 您不需要在 () @ 符號之前新增 ,而且您無法使用 r 命令 來顯示 其中一個別名的值。
根據預設,如果您未定義固定名稱別名,則為空字串。
自動別名
調試程式會設定下列自動別名。
別名名稱 | 別名對等專案 |
---|---|
$ntnsym |
計算機原生架構上NT符號最適合的模組。 此別名可以等於 ntdll 或 nt。 |
$ntwsym |
在 32 位偵錯期間,使用 WOW64 的 NT 符號最適合的模組。 此別名可以是 ntdll32 或其他 32 位版本的 Ntdll.dll。 |
$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、kernel-mode .restart 和使用者模式 .restart) 別名。
在腳本檔案中使用別名
當您在腳本檔案中使用別名時,請務必特別小心,以確保別名在正確的時間展開。 請考慮下列文稿:
.foreach (value {dd 610000 L4})
{
as /x ${/v:myAlias} value + 1
.echo value myAlias
}
ad myAlias
第一次透過 迴圈時 ,aS (Set Alias) 命令會將值指派給 myAlias。 指派給 myAlias 的值是 1 加上 610000 (dd 命令的第一個輸出) 。 不過,執行 .echo (Echo 批注) 命令時,myAlias 尚未展開,因此不會看到610001,而是會看到文字 “myAlias”。
0:001> $$>< c:\Script02.txt
00610000 myAlias
00905a4d 0x610001
00000003 0x905a4e
00000004 0x4
0000ffff 0x5
問題在於,在輸入新的程式碼區塊之前,不會展開 myAlias。 迴圈的下一個專案是新的區塊,因此 myAlias 會展開為610001。 但太晚:我們應該第一次透過迴圈看到610001,而不是第二次。我們可以將 .echo (Echo 批注) 命令封入新的區塊中,以修正此問題,如下列腳本所示。
.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
第一個命令會將 $t 0 虛擬快取器的值設定為 5。 第二個命令會刪除先前可能已指派給 myAlias 的任何值。 第三個命令會採用 ?@$t 0 命令的第三個令牌,並嘗試將該令牌的值指派給 myAlias。 第四個命令會列出所有別名及其值。 我們會預期 myAlias 的值是 5,但值是 “Token” 這個字。
Alias Value
------- -------
myAlias Token
問題是 ,as 命令位於 .foreach 循環主體中行的開頭。 當行開頭 為 命令時 ,該行中的別名和標記不會展開。 如果我們將分號或空格放在 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 命令之前新增分號,否則別名取代不會發生在該行上。
當您使用此類型的遞歸定義時,每次使用別名時,都會立即轉譯。 例如,下列範例會顯示 3,而非 7。
0:000> r $.u2=2
0:000> r $.u1=1+$u2
0:000> r $.u2=6
0:000> ? $u1
Evaluate expression: 3 = 00000003
同樣地,下列範例會顯示 3,而非 7。
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 註冊兩次。
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 檔案中預先定義固定名稱別名。 若要預先定義固定名稱別名,請新增您想要 [NTSD] 專案的 $u 欄位,如下列範例所示。
[NTSD]
$u1:_ntdll!_RtlRaiseException
$u2:"dd esp 14;g"
$u9:$u1 + 42
您無法在 Tools.ini 檔案中設定使用者命名別名。
Fixed-Name 別名與 User-Named 別名
用戶名稱別名比固定命名別名更容易使用。 其定義語法更簡單,您可以使用 al (List Aliases) 命令加以 列出。
如果在其他文字旁邊使用固定命名別名,則會加以取代。 若要在使用者名稱別名位於其他文字旁邊時加以取代,請將它括在 ${ } (別名解釋器) 令牌中。
固定名稱別名取代會在使用者命名別名取代之前發生。