VC 6.0调试篇:变量的观察--watch窗口的技巧.doc_第1页
VC 6.0调试篇:变量的观察--watch窗口的技巧.doc_第2页
VC 6.0调试篇:变量的观察--watch窗口的技巧.doc_第3页
VC 6.0调试篇:变量的观察--watch窗口的技巧.doc_第4页
VC 6.0调试篇:变量的观察--watch窗口的技巧.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

vc+6.0调试篇:变量的观察-watch窗口的技巧写一下vc6的watch窗口的一些小技巧,对于调试过程是非常有帮助的。vc6年纪已经很大了,微软好像也不再支持,但是还是有很多人在用。我本人是非常喜欢它的小巧(相对vs2003,2005),占资源少,即使这样它的调试功能仍然超级强,真是不错。 好,废话到此结束,下面贴代码来说明:#include#includeclassautoexpandpublic:autoexpand(intval,char*pval)a=val;p=pval;private:inta;char*p;classcantexpandpublic:cantexpand(intval,char*pval)a=val;p=pval;private:inta;char*p;intmain(void)intp4=0x31,0x32,0x33,0x34;int*a=p;file*fp=fopen(filenotexist,r);dworddwerror=getlasterror();autoexpand ae(10, abc); cantexpand ce(10, abc);return0; 上面代码中出现的变量先说明一下: p: 是整形数组,含四个元素,总共16byte。 a: 整形指针,指向数组p fp: 文件指针,用来标识打开的file not exist,我机器里是没这个文件的。 dwerror: 获得fopen失败的错误码。一般来说可以用formatmessge来格式化这个错误原因或者直接用vc自带的工具errorlookup来查找这个错误码的解释。 ae和ce: 是自定义的autoexpand类型的变量和cantexpand类型的变量。注意,这两种类型只有类型名字不同。 下面看一下我在调试这个程序的时候,watch窗口的显示:上图中,左边是context窗口的locals页,显示所有局部变量。右边是watch窗口,是我自己添加的要观察的对象。好,先看看整形数组p。我们看到context窗口的显示p其实只显示了数组的地址,点了+号展开后,显示出了4个整形数据。而右边窗口,我添加了一个p,c。p后面加个,c是什么意思呢?看看效果,p,c下面的0,1,2,3显示的是这4个整形值对应的ascii字符哈。所以从这里有了第一个小技巧:1.watch窗口中,在整形变量后面加上,c可以显示该变量对应的ascii字符。实际上,可以直接敲数字这么显示也行。比如上面右边窗口中的118,c的对应值是v。也就是说118对应的ascii字符是v。那么,反过来,要知道一个字符的ascii码值怎么看呢?看上面,v,d就是显示字符v对应的十进制ascii码值是118。 v,x显示的是对应的十六进制的ascii码值。除了,c ,d ,x外,还有一些其他的参数可以加,见后面的附表。然后我们看看变量a. a是个指针。看左边窗口,即使点了它的+号展开,也只看到了它指向的地址的第一个元素(49).如果想要看得更多的数据,也可以像我一样,在上面的memory窗口里看。但是memory窗口只有一个,要看多个指针指向的数据就麻烦了,切来切去。那就在watch窗口中显示吧,a,4就可以了,看到我的watch窗口的显示没?所以,有了第二个小技巧:2.watch窗口中,把指针当成数组看,只要在指针名后面加上一个长度,就可以想看数组一样看到对应的数据了。比如我上面的a,4。那么如果一个指针指向的数据很大,比如一个整形指针a是指向一个1000个整数的大块内存,我只想看看最后4个数据,要怎样呢?那就 (a+996),4 呗。从第996个数据开始,看4个接下来这个小技巧是我最喜欢的一个了。调试中遇到系统函数调用失败的情况,通常都要加上getlasterror()函数获得返回值,然后查对应的解释才知道错误原因。比如,我上面的代码要打开一个不存在的文件,结果fopen失败。取回了错误码dwerror=2,一查才知道是文件不存在。那么可不可以不用查,调试器直接告诉我原因呢?当然可以,不然我写这干嘛!刚才的错误码2是记录在dwerror中了,所以只要在watch窗口看看dwerror,hr 看value栏:系统找不到指定的文件!爽吧!总结一下,第三个小技巧:3. 在watch窗口中察看错误原因,只需要在错误之后面颊上,hr就可以了。比如我上面的 dwerror,hr 和 2, hr 都能够显示错误消息。想看某个错误码的解释,只要后面加上,hr就轻松搞定,非常方便!这里还要提一下的是,即使不调用getlasterror()也是可以看错误原因的。在fopen()调用完后,直接在watch窗口敲 err,hr 也可以显示最近一次的错误原因。但是我机器重新装了os,还没装vc,现在用的还是安装前的尸体。所以这个err,hr的显示有问题。不过还是有应对之法,那就是强大的tib信息。watch窗口看看*(unsigned long*)(tib+0x34), hr也是一样的。至于为什么吗,那就是getlasterror的机制了。还剩2个变量,ae和ce。这两变量类型名不同,但是其他全都一样。为什么这两个变量在watch窗口中显示的不一样呢?ae直接显示出了类成员的值,ce就显示了个.嗯,这就是最后一个小技巧:4. 在vc安装目录的msdevbin目录下有个autoexp.dat文件。可以在里面自定义数据的显示。具体的看看它前面的大段说明,说得很详细。我就是在文件后面加上一行autoexpand =int_val= sz_val=。附表:下表说明调试器可识别的格式说明符。说明符格式值显示d,isigned 十进制整数0xf000f065-268373915uunsigned 十进制整数0x0065101ounsigned 八进制整数0xf0650170145x,x十六进制整数61541(十进制)0x0000f065l,h用于 d、i、u、o、x、x 的 long 或 short 前缀00406042,hx0x0c22fsigned 浮点型3./2.1.500000esigned 科学计数法3./2.1.500000e+000gsigned 浮点型或 signed 科学计数法,无论哪个都更短3./2.1.5c单个字符0x0065101 es字符串0x0012fde8hello worldsuunicode 字符串hello worldhrhresult 或 win32 错误代码。(调试器自动将 hresult 解码,因此这些情况下不需要该说明符。0x00000000ls_okwc窗口类标志。0x00000040wc_defaultcharwmwindows 消息数字0x0010wm_close下表包含用于内存位置的格式化符号。符号格式显示ma64 个 ascii 字符0x0012ffac .4.0.0w&.1w&.0.:w.1.1.jo&.1.2.1.0y.1m以十六进制表示的 16 个字节,后跟 16 个 ascii 字符0x0012ffac b3 34 cb 00 84 30 94 80 ff 22 8a 30 57 26 00 00 .4.0.0w&.mb以十六进制表示的 16 个字节,后跟 16 个 ascii 字符0x0012ffac b3 34 cb 00 84 30 94 80 ff 22 8a 30 57 26 00 00 .4.0.0w&.mw8 个字0x0012ffac 34b3 00cb 3084 8094 22ff 308a 2657 0000md4 个双倍字长0x0012ffac 00cb34b3 8094308

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论