VC6.0调试篇:watch窗口的窍门技巧

VC6watch窗口些小窍门技巧对于调试过程是非常有帮助VC6年纪已经很大了微软好像也不再支持但是还是有很多人在用我本人是非常喜欢它小巧(相对vs2003,2005)占资源少即使这样它调试功能仍然超级强真是不错

废话到此结束下面贴代码来介绍说明:



="preprocessor">#<stdio.h>
    ="dp-cpp">
  1. ="alt">="preprocessor">#<windows.h>
  2. ="">
  3. ="alt">="keyword">AutoExpand
  4. ="">{
  5. ="alt">="keyword">public:
  6. ="">AutoExpand(="datatypes">val,="datatypes">char*pval)
  7. ="alt">{
  8. ="">a=val;
  9. ="alt">p=pval;
  10. ="">}
  11. ="alt">="keyword">private:
  12. ="">="datatypes">a;
  13. ="alt">="datatypes">char*p;
  14. ="">};
  15. ="alt">
  16. ="">="keyword">CantExpand
  17. ="alt">{
  18. ="">="keyword">public:
  19. ="alt">CantExpand(="datatypes">val,="datatypes">char*pval)
  20. ="">{
  21. ="alt">a=val;
  22. ="">p=pval;
  23. ="alt">}
  24. ="">="keyword">private:
  25. ="alt">="datatypes">a;
  26. ="">="datatypes">char*p;
  27. ="alt">};
  28. ="">
  29. ="alt">="datatypes">(="keyword">void)
  30. ="">{
  31. ="alt">="datatypes">p[4]={0x31,0x32,0x33,0x34};
  32. ="">="datatypes">*a=p;
  33. ="alt">
  34. ="">="datatypes">FILE*fp=fopen(="">"FileNotExist",="">"r");
  35. ="alt">="datatypes">DWORDdwError=GetLastError;
  36. ="">
  37. ="alt">AutoExpandae(10,="">"abc");
  38. ="">CantExpandce(10,="">"abc");
  39. ="alt">
  40. ="">="keyword">0;
  41. ="alt">}



上面代码中出现变量先介绍说明下:

p: 是整形含 4个元素总共16Byte

a: 整形指针指向 p

fp: 文件指针用来标识打开"File Not Exist"我机器里是没这个文件

dwError: 获得fopen失败般来说可以用FormatMessge来格式化这个原因或者直接用VC自带工具errorlookup来查找这个解释

aece: 是自定义AutoExpand类型变量和CantExpand类型变量注意这两种类型只有类型名字区别

下面看下我在调试这个时候watch 窗口显示:

watch窗口举例图



上图中左边是Context窗口Locals显示所有局部变量右边是Watch窗口是我自己添加要观察对象

先看看整形p我们看到Context窗口显示p其实只显示了地址点了+号展开后显示出了4个整形数据而右边窗口我添加了p,cp后面加个",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显示是对应十 6进制ASCII码值除了",c" ",d" ",x"还有些其他参数可以加见后面附表

然后我们看看变量a. a是个指针看左边窗口即使点了它+号展开也只看到了它指向地址个元素(49).如果想要看得更多数据也可以像我在上面Memory窗口里看但是 Memory窗口只有要看多个指针指向数据就麻烦了切来切去那就在watch窗口中显示吧a,4就可以了看到我watch窗口显示没?所以有了第 2个小窍门技巧:

2.watch窗口中把指针当成只要在指针名后面加上个长度就可以想看样看到对应数据了比如我上面a,4那么如果个指针指向数据很大比如个整形指针a是指向1000个整数大块内存我只想看看最后4个数据要怎样呢?那就 (a+996),4 从第996个数据开始4~

接下来这个小窍门技巧是我最喜欢个了调试中遇到系统失败情况通常都要加上 GetLastError获得返回值然后查对应解释才知道原因比如我上面代码要打开个不存在文件结果fopen失败取回了dwError=2查才知道是文件不存在那么可不可以不用查调试器直接告诉我原因呢?当然可以不然我写这干嘛!刚才2是记录在dwError中了所以只要在watch窗口看看dwError,hr value栏:系统找不到指定文件!爽吧!整理总结第 3个小窍门技巧:

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个变量aece这两变量类型名区别但是其他全都为什么这两个变量在 watch窗口中显示样呢?ae直接显示出了类成员ce就显示了个......这就是最后个小窍门技巧:

4. vc安装目录msdev\bin目录下有个autoexp.dat文件可以在里面自定义数据显示具体看看它前面大段介绍说明说得很详细我就是在文件后面加上AutoExpand =_val=<a,d> sz_val=<p,s>

太长了休息!

Tags: 

延伸阅读

最新评论

发表评论