本文介紹使用調試器命令必須遵循的語法規則。使用Windbg調試時,應遵照如下通常語法規則:算法
閱讀本文中的命令引用注意如下事項:編程
帶豎線(XXX|YYY)的大括號表示必須僅使用其中一個封閉參數。數組
1、數字表達式緩存
調試器接受兩個不一樣類型的數值表達式:C++表達式和MASM 表達式。 每一個這些表達式遵循用於輸入和輸出本身語法規則。數據結構
1.一、MASM 數字和運算符函數
運算符 | 含義 |
---|---|
+工具 |
一元加字體 |
-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 表達式中使用如下其餘運算符。
運算符 | 含義 |
---|---|
$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") |
計算結果爲,則返回 TRUE或FALSE取決因而否字符串匹配模式。 匹配不區分大小寫。 模式能夠包含各類通配符和說明符。 有關語法的詳細信息,請參閱字符串通配符語法。 |
$vvalid(Address, Length) |
肯定是否內存範圍的開始處地址,併爲擴展長度字節是否有效。 若是有效,內存$vvalid的計算結果爲 1。 若是內存是無效的$vvalid計算結果爲 0。 |
1.二、C++數字和運算符
Windbg中的C++表達式解析器支持全部形式的C++表達式語法。該語法包括全部數據類型(包括指針、浮點數和數組)和全部C++一元和二元運算符。
運算符 | 含義 |
---|---|
表達式 // 註釋 |
忽略全部後續文本 |
類 ::成員 類 :: ~成員 ::名稱 |
類的成員 類 (析構函數) 的成員 全局 |
結構 。 字段 指針 - > 字段 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++表達式中使用寄存器和僞寄存器。必須在寄存器或僞寄存器以前添加at符號(@)。表達式計算器自動執行正確的強制轉換。實際寄存器和整數值僞寄存器被轉換爲ulong64。全部地址都轉換爲puchar,$thread轉換爲ethread*,$proc轉換爲eprocess*,$teb轉換爲teb*,$peb轉換爲peb*。不能經過賦值或反作用運算符更改寄存器或僞寄存器。必須使用r(寄存器)命令更改這些值。
宏 | 返回值 |
---|---|
#CONTAINING_RECORD (地址,類型,字段) |
返回給定類型的結構和結構中的字段的地址結構的實例的基址。 |
#FIELD_OFFSET (類型,字段) |
返回命名的字段的字節偏移量中的已知的結構類型。 |
#RTL_CONTAINS_FIELD (Struct,大小,字段) |
指示給定的字節大小是否包括所需的字段。 |
#RTL_FIELD_SIZE(Type, Field) |
而無需字段的類型返回已知類型的結構中的字段的大小。 |
#RTL_NUMBER_OF(Array) |
以靜態方式調整大小的數組中返回元素的數。 |
#RTL_SIZEOF_THROUGH_FIELD(Type, Field) |
經過和包括在指定的字段會返回已知類型的結構的大小。 |