VS监视、快速监视的使用

时间:2024-04-14 09:55:34

1、监视

此部分转自:https://blog.****.net/JiLuoXingRen/article/details/72811614

嫌我啰嗦的可以直接看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消息的名称,他却给我显示一个整数。解决方法:手工查头文件

……

VS监视、快速监视的使用

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

VS监视、快速监视的使用

可以看到,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
VS监视、快速监视的使用 说明

如果存在“hv”格式说明符,调试器会尝试确定缓冲区的长度并显示相应的元素数。 由于调试器并非总是可以查找确切的数组缓冲区大小,只要可能时,就应该使用大小说明符 (pBuffer,[bufferSize])。 “Hv”格式说明符用于缓冲区大小尚不可使用的情况。

 

然后是伪变量:

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

VS监视、快速监视的使用

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

 

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

2、快速监视

快速监视与监视作用一致作用一致,但是快速监视功能更强,以下部分转自:https://blog.****.net/qq_34059765/article/details/80581879

我们平时在使用Visual Studio调试的时候,通常会遇到鼠标移上去还是无法查看变量的值,比如Session["变量名"],

这时候我们就可以采用VS提供的方法——快速监视来解决这个问题了。

VS监视、快速监视的使用

鼠标移上去-》右键-》快速监视

VS监视、快速监视的使用

在输入框内输入Session["SafeCode"],点击“重新计算”,就可以看到Session的值了。

VS监视、快速监视的使用