嫌我啰嗦的可以直接看MSDN:

C++ 中的格式说明符:https://msdn.microsoft.com/zh-cn/library/75w45ekt.aspx

上下文运算符(C++):https ://msdn.microsoft.com/zh-cn/library/y2t7ahxk.aspx

伪变量:https://msdn.microsoft.com/zh-cn/library/ms164891.aspx


【监视】窗口是很常用的调试窗口,与【自动窗口】、【局部变量】窗口很相似,但是更为强大,不仅可以显示变量的值,还可以显示任意符合语法的表达式的值,甚至可以修改变量的值。




但是用【监视】窗口有些时候会出现一些尴尬的情况,例如


1.我想将int显示成字符。解决方法:(char)强制类型转换


2.我想看new出来的数组的内容,他却给我显示首地址。解决方法:(类型(*)[数组长度])强制类型转换


4.我想看Windows消息的名称,他却给我显示一个整数。解决方法:手工查头文件


……


VisualVM如何开启监控 visualstudio监视窗口_visual studio


简直苦大仇深啊!!如果说前两个不是刚性需求,第三个则会吐血,因为Windows消息可没办法通过强制类型转换解决问题。现在就到格式说明符出场了,直接上图:


VisualVM如何开启监控 visualstudio监视窗口_调试_02


可以看到,Windows消息的变量msg已经显示为WM_GETDLGCODE了,而数组和int也实现了上图的显示效果,仅仅是加了“,”和一个短的字符串,这个就是格式说明符。全部的格式说明符如下:


说明符

格式

原始监视值

显示的值

d

十进制整数

0x00000066

102

o

无符号的八进制整数

0x00000066

000000000146

x


 h

十六进制整数

102

0xcccccccc

X


 H

十六进制整数

102

0xCCCCCCCC

c

单个字符

0x0065, c

101 'e'


const char * 字符串

<location> “hello world”

"hello world"

sb

const char * 字符串

<location> “hello world”

hello world

s8

const char * 字符串

<location> “hello world”

"hello world"

s8b

const char * 字符串

<location> “hello world”

"hello world"

su

const wchar_t* const


char16_t * 字符串

<location> L”hello world”

L"hello world"


u"hello world"

sub

const wchar_t* const


char16_t * 字符串

<location> L”hello world”

hello world

bstr

BSTR string

<location> L”hello world”

L”hello world”

s32

UTF-32 string

<location> U”hello world”

U”hello world”

s32b

UTF-32 string (no quotation marks)

<location> U”hello world”

hello world

en

enum

Saturday(6)

星期六

hv

new int[3]

<location>{<first member>}

<location>{<first member>, <second member>, …}

na

取消指向对象的指针的内存地址。

<location>, {member=value…}

{member=value…}

nd

仅显示基类信息,忽略派生的类

(Shape*) square

仅显示基类信息

hr

HRESULT 或 Win32 错误代码。 (调试器自动将 HRESULT 解码,因此这些情况下不需要该说明符。)

S_OK

S_OK

wc

窗口类标志

0x0010

WC_DEFAULTCHAR

wm

Windows 消息数字

16

WM_CLOSE

!

原始格式,忽略任何数据类型视图自定义项

<customized representation>

4



(pBuffer,[bufferSize])。 “Hv”格式说明符用于缓冲区大小尚不可使用的情况。




然后是伪变量:


这里介绍的伪变量是$err,伪变量都以$开头。$err可以显示API调用的结果状态,也就是如果在调用一个API函数之后调用GetLastError函数得到的值,配合hr格式说明符可以看到API执行的状态


VisualVM如何开启监控 visualstudio监视窗口_VisualVM如何开启监控_03


上一次的API执行时成功完成,本来$err的值是0,配合hr格式说明符显示成了ERROR_SUCCESS。




另外伪变量还可以在反汇编调试时显示寄存器的值,例如$eax、$ebx,不过不支持浮点寄存器XMM0~7。不过,如果是寄存器伪变量,如果C/C++代码中没有重名的变量,是可以不加上$的。






到此为止