天天看點

符号文法和符号比對

符号用來直接操作被調試程式的助記符(tokens)。例如,可以通過指令bp main 來在main函數上設定斷點,或者使用dd MyInt L1指令來顯示整數變量MyInt 的值。很多情況下,符号可以作為調試器指令的參數。可以支援大多數數字參數,以及一些文本參數。除了正常的符号文法之外,也有一些适用于各種單獨情況的文法規則。

正常符号文法規則

符号名由一個或多個字元組成,但是總是以字母、下劃線(_)、問号(?)或美元符号($)開頭。

符号名可以用子產品名來進行限制。使用一個感歎号(!)來分隔子產品名和符号(例如,mymodule!main)。沒有使用子產品名的時候,符号也可以用感歎号作為字首。即使對于局部變量,使用不帶子產品名的感歎号也尤其有用,它可以向調試器指令指明某個參數是一個名字而不是16進制數字。例如,如果沒有加上感歎号字首或者-n選項的話,變量fade會被指令dt (Display Type)當作一個位址來讀取。但是,可以通過加上美元符号( $ )和感歎号( ! )當作字首來指明一個符号是局部變量,如$!lime。

符号名是完全不區分大小寫的。這意味着如果程式中同時存在myInt 和MyInt ,不能被調試器正确識别;不管怎麼寫,通路它們的指令都有可能通路到另外一個。

數值表達式中的符号文法

調試器可以識别兩種不同的表達式:Microsoft宏彙編(MASM)表達式和C++表達式。由于和符号相關,這兩種文法形式有以下差別:

  • 在MASM表達式中,每個符号都被解釋成位址。根據該符号引用的内容不同,它可以是全局變量、局部變量、函數、段、子產品的位址或者其他任何可識别的标志。
  • 在C++ 表達式中,符号根據它的類型來解釋。根據引用内容的不同,可能被解釋為整數、資料結構、函數指針或任何其他資料類型。不符合C++資料類型的符号(例如未更改的子產品名)都會産生文法錯誤。

關于如何使用每一種文法的說明,檢視表達式求值。

如果使用MSAM表達式文法,任何可以被解釋為16進制數或寄存器的符号(例如,BadFeed, ebX)都必須用感歎号作為字首。這能確定調試器将它識别為符号。

ss (Set Symbol Suffix)指令可以用來設定符号字尾。這使得調試器在找不到符号的情況下自動在符号名後添加"A" 或者"W"。

很多Win32函數存在ASCII和Unicode版本。這些函數的名字後被分别添加了"A" 或"W"。使用符号字尾可以幫助調試器搜尋這些符号。

字尾比對預設沒有激活。

文本表達式中的符号文法

繼續閱讀