windbg学习--- C++表达式

C++ 表达式解析器支持所有 C++ 表达式语法形式。包括所有数据类型(包括指针,浮点数,数组)以及 C++ 所有一元和二元运算符。

?? 默认是对C++表达式求值

C++ 表达式中的数值

除非另有说明,C++ 表达式中的数值被当作十进制来解析。添加 0x 前缀指定十六进制整数。添加 0(零)指定八进制整

这点比较坑,一定要特别注意,因为大家习惯是用16进制的

0:000> ? 1
Evaluate expression: 1 = 00000001
0:000> ?? 1
int 1
0:000> ?? 1f
float 1
0:000> ? 1f
Evaluate expression: 31 = 0000001f
0:000> ?? 0x1f
int 31
可以看到c++表达式输出的结果都是10进程

调试器使用的缺省基数不影响 C++ 表达式的输入,也就是n 16对C++的输出没有任何影响

C++ 表达式中的字符和字符串

输入字符时用单引号(')括住。可以使用标准的 C++ 转义字符。

输入字符串时用双引号(")括住。可以在字符串中使用转义字符序列 " 。然而,字符串对于表达式求值器无意义

0:000> ?? 'c'
char 99 'c'
0:000> ?? "c:"
EOF in literal '"c:"'

C++ 表达式中的运算符

可以用圆括号来掩盖优先级规则

数据类型按C++语言的常规方法来指定。可以识别表示数组([ ]),指针成员(->),UDT(译注:用户定义类型,User defined types)成员(.),以及所有的类成员(::)。支持所有算术运算符,包括赋值运算符和带副作用的运算符。但是,不允许使用newdeletethrow 运算符,当然,也不能调用函数。

支持指针运算,也可以正确计算偏移。注意不能给函数指针加上某个偏移值 (如果需要这样做,首先把它强制转换为指向字符的指针)。

Class :: Member

Class
::~Member

:: Name
类成员

类成员(析构函数)

全局的

0:002> ?? VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest
<function> 0x00402c00
 void  VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest+0( void )
0:002> ?? g_NewWinVerifyTrust
<function> * 0x00000000
我们可以对比下用MASM规则来:

0:002> ? VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest
Evaluate expression: 4205568 = 00402c00
0:002> ? g_NewWinVerifyTrust
Evaluate expression: 4290536 = 004177e8
可以看到,都变成求值了

Structure . Field

Pointer
-> Field

Name
[integer]

LValue ++

LValue --

dynamic_cast <
type>(Value)

static_cast <
type>(Value)

reinterpret_cast <
type>(Value)

const_cast <
type>(Value)
结构成员

被引用结构的成员

数组下标

加一(计算后)

减一(计算后)

类型强制转换(总会执行)

类型强制转换(总会执行)

类型强制转换(总会执行)

类型强制转换(总会执行)

0:000> ?? WinTrustData
struct _WINTRUST_DATA
   +0x000 cbStruct         : 0x2c
   +0x004 pPolicyCallbackData : (null) 
   +0x008 pSIPClientData   : (null) 
   +0x00c dwUIChoice       : 2
   +0x010 fdwRevocationChecks : 0
   +0x014 dwUnionChoice    : 1
   +0x018 pFile            : 0x0012f464 WINTRUST_FILE_INFO_
   +0x018 pCatalog         : 0x0012f464 WINTRUST_CATALOG_INFO_
   +0x018 pBlob            : 0x0012f464 WINTRUST_BLOB_INFO_
   +0x018 pSgnr            : 0x0012f464 WINTRUST_SGNR_INFO_
   +0x018 pCert            : 0x0012f464 WINTRUST_CERT_INFO_
   +0x01c dwStateAction    : 0
   +0x020 hWVTStateData    : (null) 
   +0x024 pwszURLReference : (null) 
   +0x028 dwProvFlags      : 0
0:000> ?? WinTrustData.pFile
struct WINTRUST_FILE_INFO_ * 0x0012f464
   +0x000 cbStruct         : 0x10
   +0x004 pcwszFilePath    : 0x00278680  -> 0x65
   +0x008 hFile            : (null) 
   +0x00c pgKnownSubject   : (null) 

0:000> ?? static_cast<int>(&WinTrustData)
int 1242152
0:000> ? WinTrustData
Evaluate expression: 1242152 = 0012f428
Value * Value

Value
/ Value

Value
% Value
乘法

除法

求余
0:000> ?? 4*2
int 8
0:000> ?? 4 / 2
int 2
0:000> ?? 4/2
int 2
0:000> ?? 4%2
int 0

Value + Value

Value
- Value
加法

减法
0:000> ?? 3+1
int 4
0:000> ?? 3-1
int 2

Value << Value

Value
>> Value
左移位

右移位
0:000> ?? 2>>1
int 1
0:000> ?? 2<<1
int 4

(type) Value

sizeof value

sizeof( type )

++
LValue

-- LValue

~ Value

! Value

- Value

+ Value

& LValue

* Value
类型强制转换(总会执行)

表达式大小

数据类型大小

加一(计算前)

减一(计算前)

按位反

逻辑非

一元运算符,负数

一元运算符,正数

数据类型的地址

解引用,取值
0:000> ?? sizeof 1
unsigned int 4
0:000> ?? sizeof(WinTrustData)
unsigned int 0x2c

Value < Value

Value
<= Value

Value
> Value

Value
>= Value
小于(比较)

小于等于(比较)

大于(比较)

大于等于(比较)
0:000> ?? 1<2
bool true
0:000> ?? 1<=2
bool true
0:000> ?? 1>2
bool false
0:000> ?? 1>=2
bool false

Value == Value

Value
!= Value
等于(比较)

不等于(比较)
0:000> ?? 1==2
bool false
0:000> ?? 1!=2
bool true

Value & Value 按位与
Value ^ Value 按位异或(不同于 OR)
Value | Value 按位或
Value && Value 逻辑与
Value || Value 逻辑或
0:000> ?? 1&2
int 0
0:000> ?? 1^2
int 3
0:000> ?? 1|2
int 3
0:000> ?? 1&&2
bool true
0:000> ?? 1||2
bool true
0:000> ?? 0&&2
bool false

LValue = Value

LValue
*= Value

LValue
/= Value

LValue
%= Value

LValue
+= Value

LValue
-= Value

LValue
<<= Value

LValue
>>= Value

LValue
&= Value

LValue
|= Value

LValue
^= Value
赋值

乘之后赋值

除之后赋值

求余之后赋值

加之后赋值

减之后赋值

左移位之后赋值

右移位之后赋值

与之后赋值

或之后赋值

异或之后赋值
Value ? Value : Value 三元条件运算符
Value , Value 逗号运算符。计算所有值,保留最右边的值


使用@@c++(...)可以显式指定括号中表达式所使用的语法规则,





原文地址:https://www.cnblogs.com/hgy413/p/3693402.html