在调试C(++)的时候,常会用到Watch或者Quick Watch来观察当前一些变量的数据,
但是在使用过程中常会遇到一些不方便的情况,最常见的,比如:
- 指针变量数组只能知道第一个元素的值
- byte的值自做主张地给你标上字符
- 系统消息仅仅是一个数值,不知道具体的意义等等
如何解决这些问题呢?
其实在Watch或Quick Watch里有一种语法,称为格式标志符(Format Specifiers),使用这个,可以非常方便地解决上述问题,并且可以做到更多……
- 比如:
当我需要知道BYTE类型的a的内容时,它给出的却是自做主张的字符串,并且只能给出第一个地址的BYTE类型值:
====>
此时,你可以在Expression框里写上"a, 20X",这样你就可以看到全部BYTE值了
- 再比如,
如果你想知道当前的GetLastError值,并不需要调用GetLastError函数,也不需要用FormatMessage来显示具体内容,只需要在Watch框里填写:$ERR即可。
如果要知道具体内容,只需在后面加上hr,如:
这其中,逗号后面的,就称为Format Specifier。
- 常用的还有:
d, i, u, o, x, X, f, e, g等,跟C语言printf里的一样,表示数字的各种形式,并支持4X等写法;
c, s, su(Unicode String)等,用于显示字符及字符串;
hr 用于显示Win32 error code;
wm用于显示windows消息,比如WM_CLOSE等
其中,hr本来用于显示HRESULT的内容的,在VS2010中,不加hr也可以显示HRESULT的可读性内容了。
- 对于指针,
为了解决只能显示第一个地址的内容的问题,可以在指针的后面加上数目,比如:
pBuf, 20将显示pBuf指针及之增20个地址的所有内容,这个很好地解决了指针型数组变量的内容显示问题。
为了简化,对于指针的显示,还有一些约定的用法,比如:
pBuf, ma表示,显示pBuf起64个ASCII码字符;
pBuf, m表示,显示pBuf起16个byte的16进制形式,后面紧跟着该16个byte的ASCII码字符形式;
pBuf, mw表示,显示8个word;pBuf, md显示4DWORD;pBuf, mq显示2QWORD等等
总之,watch及quick watch窗口功能强大,还待我们进一步发掘呀。