Windbg命令的語法規則系列(一)

本文介紹使用調試器命令必須遵循的語法規則。使用Windbg調試時,應遵照如下通常語法規則:算法

  • 您能夠在命令和參數中使用大小寫字母的任意組合,除非在本節的主題中特別指出。
  • 能夠用一個或多個空格或逗號(,)分隔多個命令參數。
  • 一般能夠省略命令與其第一個參數之間的空格。若是這種省略不會形成任何歧義,則能夠常常省略其餘空格。

閱讀本文中的命令引用注意如下事項:編程

  • 粗體字體的字符表示必須逐字鍵入的項目。
  • 斜體字體的字符表示參考主題「參數」部分中解釋的參數。
  • 括號([xxx])中的參數是可選的。帶有豎線([XXX|YYY])的括號表示可使用一個或無一個封閉參數。
  • 帶豎線(XXX|YYY)的大括號表示必須僅使用其中一個封閉參數。數組

1、數字表達式緩存

調試器接受兩個不一樣類型的數值表達式:C++表達式MASM 表達式每一個這些表達式遵循用於輸入和輸出本身語法規則。數據結構

1.一、MASM 數字和運算符函數

  在Windows包的4.0版調試工具以前,ntsd、cdb、kd和windbg僅使用Microsoft宏彙編程序(masm)表達式語法。
  • MASM表達式中的數字
    在masm表達式中咱們能夠輸入二進制、八進制、十進制、十六進制數字。 使用n(設置基數)命令將默認基數設置爲1六、10或8。全部未固定的數字都將在此基數中解釋。能夠經過指定0x前綴(十六進制)、0n前綴(十進制)、0t前綴(八進制)或0y前綴(二進制)來重寫默認基數。 您還能夠經過在數字後面添加h來指定十六進制數字。您能夠在數字中使用大寫或小寫字母。例如,「0x4ab3」、「0x4ab3」、「4ab3h」、「4ab3h」和「4ab3h」具備相同的含義。 若是不在表達式的前綴後面添加數字,則該數字將被讀取爲0。所以,您能夠將0寫爲0,前綴後跟0,而且只寫前綴。例如,在十六進制中,「0」、「0x0」和「0x」具備相同的含義。 您能夠以XXXXXXXX`XXXXXXXX格式輸入十六進制64位值。
  • MASM表達式中的符號
    在masm表達式中,任何符號的數值都是其內存地址。根據符號所指的內容,此地址是全局變量、局部變量、函數、段、模塊或任何其餘可識別標籤的地址。要指定與地址關聯的模塊,請包括模塊名稱和感嘆號(!)在符號名稱以前。若是符號能夠解釋爲十六進制數,請在符號名以前包含模塊名和感嘆號,或僅包含感嘆號。 使用兩個冒號(:)或兩個下劃線(_)指示類的成員。 只有在符號名稱前面添加模塊名稱和感嘆號時,才能在符號名稱中使用重音符(`)或撇號(')。
  •   MASM表達式中的數字運算符
      可使用一元運算符修改表達式的任何組件。您可使用二進制運算符組合任意兩個組件。一元運算符優先於二元運算符。使用多個二進制運算符時,運算符遵循下表中描述的固定優先級規則。 您能夠始終使用括號來覆蓋優先規則。若是一個MASM表達式的一部分被括在括號中,而且在表達式以前出現兩個符號(@),則表達式根據C++表達式規則進行解釋。不能在兩個at符號和左括號之間添加空格。還可使用@ @ C++(…)指定表達式計算器。或@@masm(…).執行算術計算時,MASM表達式計算器將全部數字和符號視爲ulong64類型。一元地址運算符將ds做爲地址的默認段。表達式按運算符優先順序計算。若是相鄰運算符的優先級相等,則表達式將從左到右進行計算。
    可使用如下一元運算符:
    運算符 含義

    +工具

    一元加字體

    -spa

    一元負指針

    若是參數爲零,則返回 1。 任何非零值的參數,則返回零。

    hi

    高 16 位

    low

    低 16 位

    by

    從指定的地址的低序位字節。

    $pby

    與相同經過,但前者的物理地址。 能夠讀取僅使用默認緩存行爲的物理內存。

    wo

    從指定的地址的低序位字。

    $pwo

    與相同wo ,但前者的物理地址。 能夠讀取僅使用默認緩存行爲的物理內存。

    dwo

    從指定的地址雙字。

    $pdwo

    與相同dwo ,但前者的物理地址。 能夠讀取僅使用默認緩存行爲的物理內存。

    qwo

    從指定的地址四字。

    $pqwo

    與相同qwo ,但前者的物理地址。 能夠讀取僅使用默認緩存行爲的物理內存。

    poi

    從指定的地址指針大小的數據。 指針大小爲 32 位或 64 位。 在內核調試,此大小基於的處理器目標計算機。 在用戶模式下調試在基於 Itanium 的計算機上,此大小爲 32 位或 64 位,具體取決於目標應用程序。 所以, poi是要使用若是你想指針大小的數據的最佳運算符。

    $ppoi

    與相同poi ,但前者的物理地址。 能夠讀取僅使用默認緩存行爲的物理內存。

    可使用如下二進制運算符。 每一個單元格中的運算符優先於較小的單元中。 相同單元中的運算符均屬於相同的優先級,從左到右進行分析。

    運算符 含義

    *

    /

    mod (或 %)

    乘法

    整數除法

    取模 (餘數)

    +

    -

    添加

    減法

    <<

    >>

    >>>

    左的移

    邏輯右移位

    算術右移位運算

    = (或 = =)

    <

    >

    <=

    >=

    !=

    等於

    小於

    大於

    小於或等於

    大於或等於

    不等於

    (或 &)

    位與

    xor (或 ^)

    按位 XOR (異或)

    (或 |)

    按位 OR 運算符

    <, >、 =、 = =、 和 ! = 的比較運算符計算結果爲 1,若是表達式爲 true 或爲零,若是表達式爲 false。 單個等號 (=) 是雙等號 (= =) 相同。 不能使用反作用或 MASM 表達式中的分配。在"操做數錯誤"中無效的操做 (如被零除) 結果返回到調試器命令窗口。

  •  MASM表達式中的非數字運算符

    此外能夠在 MASM 表達式中使用如下其餘運算符。

    運算符 含義

    $fnsucc(FnAddress, RetVal, Flag)

    解釋RetVal位於函數的返回值的值FnAddress地址。 若是此返回值被返回成功代碼,稱爲$fnsucc返回TRUE不然爲$fnsucc返回FALSE

    若是返回類型爲布爾值、 bool、 句柄、 HRESULT 或 NTSTATUS, $fnsucc正確理解是否在指定的返回值被稱爲成功代碼。 返回類型是否爲指針,全部值,而NULL纔會被視爲成功代碼。 成功的值對於任何其餘類型進行定義標誌若是標誌爲 0,一個非零值的RetVal爲 success。 若是標誌爲 1,零值的RetVal爲 success。

    $iment (地址)

    加載的模塊列表中返回映像入口點的地址。 地址指定的可移植可執行文件 (PE) 映像基址。 經過查找映像的 PE 映像標頭中的映像入口點找到該項,地址指定。

    您可使用此函數的是已在模塊列表中,並設置這兩個模塊沒法解析的斷點經過使用bu命令。

    $scmp("String1", "String2")

    計算結果爲-一、 0 或 1,如strcmp C 函數。

    $sicmp("String1", "String2")

    計算結果爲-一、 0 或 1,如stricmp Microsoft Win32 函數。

    $spat("String", "Pattern")

    計算結果爲,則返回 TRUEFALSE取決因而否字符串匹配模式匹配不區分大小寫。 模式能夠包含各類通配符和說明符。 有關語法的詳細信息,請參閱字符串通配符語法。

    $vvalid(Address, Length)

    肯定是否內存範圍的開始處地址,併爲擴展長度字節是否有效。 若是有效,內存$vvalid的計算結果爲 1。 若是內存是無效的$vvalid計算結果爲 0。

     
  • MASM表達式中的寄存器和僞寄存器
     您能夠在masm表達式中使用寄存器和僞寄存器。您能夠在全部寄存器和僞寄存器以前添加at符號(@)。at符號使調試器更快地訪問該值。 對於最多見的基於x86的寄存器來講,這個at符號是沒必要要的。對於其餘寄存器和僞寄存器,咱們建議您添加at符號,但實際上並不須要它。若是省略了較不經常使用的寄存器的at符號,調試器將嘗試將文本解析爲十六進制數,而後做爲符號,最後做爲寄存器。 還可使用句點(.)指示當前指令指針。在此期間以前不該添加at符號,而且不能將期間用做r命令的第一個參數。此期間的含義與$IP僞寄存器相同。
  • MASM表達式中的源行號
    能夠在masm表達式中使用源文件和行號表達式。必須使用重音符(`)將這些表達式括起來。

 1.二、C++數字和運算符

Windbg中的C++表達式解析器支持全部形式的C++表達式語法。該語法包括全部數據類型(包括指針、浮點數和數組)和全部C++一元和二元運算符。

  • C++表達式中的數字
    C++表達式中的數字被解釋爲十進制數,除非用另外一種方式指定它們。要指定十六進制整數,請在數字前面添加0x。要指定一個八進制整數,請在數字前面加0(零)。默認調試器基數不影響您輸入C++表達式的方式。不能直接輸入二進制數(除非在C++表達式中嵌套了一個MASM表達式)。您能夠以XXXXXXX`XXXXXXXXX格式輸入一個十六進制的64位值。(您也能夠省略重音符('.))兩種格式產生相同的值。可使用帶整數值的L、U和I64後綴。建立的數字的實際大小取決於後綴和輸入的數字。有關此解釋的更多信息,請參見C++語言引用。C++表達式計算器的輸出保持C++表達式規則指定的數據類型。可是,若是將此表達式用做命令的參數,則始終進行強制轉換。例如,當整數值用做命令參數中的地址時,沒必要向指針強制轉換整數值。若是表達式的值不能有效地轉換爲整數或指針,則會出現語法錯誤。對於某些輸出,可使用0N(十進制)前綴,但不能將其用於C++表達式輸入。
  • C++表達式中的字符和字符串
    您能夠經過將字符用單引號(「)包圍來輸入字符。標準的C++轉義字符是容許的。您能夠經過將字符串文本用雙引號(「)包圍來輸入字符串文本。您能夠在這樣的字符串中使用\「做爲轉義序列。可是,字符串對錶達式計算器沒有意義。
  • C++表達式中的符號
    在C++表達式中,每一個符號根據其類型來解釋。 根據符號所指的內容,能夠將其解釋爲整數、數據結構、函數指針或任何其餘數據類型。若是在C++表達式中使用與C++數據類型(如未修改的模塊名)不符的符號,則會出現語法錯誤。 若是符號可能不明確,能夠添加模塊名和感嘆號(!)或者只在符號前加一個感嘆號。 只有在符號名稱前添加模塊名稱和感嘆號,才能在符號名稱中使用重音符(`)或撇號(「)。 在模板名稱後面添加分隔符時,能夠在這些分隔符之間添加空格。
  •   C++表達式中的運算符
    您能夠始終使用括號來覆蓋優先規則。若是在括號中包含一部分C++表達式,並在表達式以前加上兩個符號(@),則根據MASM表達式規則對錶達式進行解釋。不能在兩個at符號和左括號之間添加空格。此表達式的最終值做爲ULUN64值傳遞給C++表達式求值器。還可使用@ @ C++(…)指定表達式計算器。或@@masm(…).數據類型一般以C++語言表示。指示數組([])、指針成員(->)和UDT成員(.)的符號。和類(::)的成員均可以識別。支持全部算術運算符,包括賦值和反作用運算符。可是,不能使用new、delete和throw運算符,也不能實際調用函數。支持指針算法並正確縮放偏移量。請注意,不能向函數指針添加偏移量。(若是必須向函數指針添加偏移量,請先將偏移量強制轉換爲字符指針。)與C++同樣,若是使用具備無效數據類型的運算符,則會發生語法錯誤。調試器的C++表達式分析器使用的規則比大多數C++編譯器稍微寬鬆一些,可是全部的主要規則都被強制執行。例如,不能移動非整數值。可使用如下運算符。每一個單元格中的運算符優先於較低單元格中的運算符。同一單元格中的運算符具備相同的優先級,並從左到右進行分析。與C++同樣,表達式評估在其值已知時結束。這個結尾使您可以有效地使用表達式,例如??myptr和&*myptr。
    運算符 含義

    表達式 // 註釋

    忽略全部後續文本

    ::成員

    :: ~成員

    ::名稱

    類的成員

    類 (析構函數) 的成員

    全局

    結構 字段

    指針 - > 字段

    Name [integer]

    LValue ++

    LValue --

    dynamic_cast <type>(Value)

    static_cast <type>(Value)

    reinterpret_cast <type>(Value)

    const_cast <type>(Value)

    結構中的字段

    引用結構中的字段

    數組下標

    增量 (以後評估版)

    遞減 (後評估版)

    類型轉換 (始終執行)

    類型轉換 (始終執行)

    類型轉換 (始終執行)

    類型轉換 (始終執行)

    (type) Value

    sizeof value

    sizeof( type )

    ++ 左值

    -- 左值

    ~

    \! ReplTest1

    ReplTest1

    +

    & 左值

    類型轉換 (始終執行)

    表達式的大小

    數據類型的大小

    增量 (以前評估版)

    遞減 (在以前評估版)

    位求補

    不 (布爾值)

    一元負

    一元加

    數據類型的地址

    取消引用

    結構 指針

    Pointer -> \* Pointer

    指向成員的結構的指針

    指向引用結構成員的指針

    Value Value

    Value / Value

    Value % Value

    乘法

    部門

    取模

    Value + Value

    Value - Value

    添加

    減法

    Value << Value

    Value >> Value

    按位左移

    按位右移

    Value < Value

    Value <= Value

    Value > Value

    Value >= Value

    早於 (比較)

    小於或等於 (比較)

    大於 (比較)

    大於或等於 (比較)

    Value == Value

    Value != Value

    等於 (比較)

    不等於 (比較)

    Value & Value

    位與

    Value ^ Value

    按位 XOR (異或)

    Value | Value

    按位 OR 運算符

    Value && Value

    邏輯與

    Value || Value

    邏輯或

    LValue =Value

    LValue = Value

    LValue /= Value

    LValue %=Value

    LValue +=Value

    LValue -= Value

    LValue <<= Value

    LValue >>= Value

    LValue &= Value

    LValue |= Value

    LValue ^= Value

    分配

    乘並賦值

    相除並賦值

    取模和分配

    添加和分配

    相減並賦值

    左移位,並將分配

    右移位和分配

    和分配

    或和分配

    XOR 並賦值

    :

    條件評估

    評估全部值,而後丟棄最右側的值以外的全部

  • C++語言中的寄存器和僞寄存器
     

    能夠在C++表達式中使用寄存器和僞寄存器。必須在寄存器或僞寄存器以前添加at符號(@)。表達式計算器自動執行正確的強制轉換。實際寄存器和整數值僞寄存器被轉換爲ulong64。全部地址都轉換爲puchar,$thread轉換爲ethread*,$proc轉換爲eprocess*,$teb轉換爲teb*,$peb轉換爲peb*。不能經過賦值或反作用運算符更改寄存器或僞寄存器。必須使用r(寄存器)命令更改這些值。

  • C++表達式中的宏
    能夠在C++表達式中使用宏。必須在宏以前添加數字符號(#)。可使用如下宏。這些宏與具備相同名稱的Microsoft Windows宏具備相同的定義。(Windows宏在winnt.h中定義。)
    返回值

    #CONTAINING_RECORD (地址類型字段)

    返回給定類型的結構和結構中的字段的地址結構的實例的基址。

    #FIELD_OFFSET (類型字段)

    返回命名的字段的字節偏移量中的已知的結構類型。

    #RTL_CONTAINS_FIELD (Struct大小字段)

    指示給定的字節大小是否包括所需的字段。

    #RTL_FIELD_SIZE(Type, Field)

    而無需字段的類型返回已知類型的結構中的字段的大小。

    #RTL_NUMBER_OF(Array)

    以靜態方式調整大小的數組中返回元素的數。

    #RTL_SIZEOF_THROUGH_FIELD(Type, Field)

    經過和包括在指定的字段會返回已知類型的結構的大小。

相關文章
相關標籤/搜索