嫌我啰嗦的可以直接看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 |
![]() |
---|
如果存在“hv”格式说明符,调试器会尝试确定缓冲区的长度并显示相应的元素数。 由于调试器并非总是可以查找确切的数组缓冲区大小,只要可能时,就应该使用大小说明符 |
然后是伪变量:
这里介绍的伪变量是$err,伪变量都以$开头。$err可以显示API调用的结果状态,也就是如果在调用一个API函数之后调用GetLastError函数得到的值,配合hr格式说明符可以看到API执行的状态
上一次的API执行时成功完成,本来$err的值是0,配合hr格式说明符显示成了ERROR_SUCCESS。
另外伪变量还可以在反汇编调试时显示寄存器的值,例如$eax、$ebx,不过不支持浮点寄存器XMM0~7。不过,如果是寄存器伪变量,如果C/C++代码中没有重名的变量,是可以不加上$的。
到此为止,详细请看文章开头的链接。