你所不知道的Visual Studio监视窗口的使用方法

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


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

但是用【监视】窗口有些时候会出现一些尴尬的情况,例如
1.我想将int显示成字符。解决方法:(char)强制类型转换
2.我想看new出来的数组的内容,他却给我显示首地址。解决方法:(类型(*)[数组长度])强制类型转换
4.我想看Windows消息的名称,他却给我显示一个整数。解决方法:手工查头文件
……
强制类型转换方式格式化显示
简直苦大仇深啊!!如果说前两个不是刚性需求,第三个则会吐血,因为Windows消息可没办法通过强制类型转换解决问题。现在就到格式说明符出场了,直接上图:
格式说明符格式化显示
可以看到,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
System_CAPS_ICON_note.jpg 说明

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


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

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


到此为止,详细请看文章开头的链接。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值