《Visual C++ 2010入门教程》系列六:VC2010常见调试技术

 

犹豫了好久,最终还是决定开始这一章,因为我不清楚到底有没有必要写这样的一章,是应该在这里说明一些简单的调试方法,还是干脆直接让大家去看《Visual C++ 2005入门经典》的第10章,因为那里已经说出了我们几乎所有的常见调试方法。

另外一点就是这一章也许会是《Visual C++ 2010入门教程》系列的最后一章了,因为在入门的这方面,我已经找不到值得和大家分享的经验了,算是黔驴技穷了吧。回头看看这个系列,最初的目的就是为了解决一些初学者常见的问题,教会初学者如何使用VS2010这个工具,因为我也经历过那些阶段,我希望我能帮助那些“曾经的我”少走弯路。

过去,我们讨论了一些诸如C++和VC有什么区别、怎么用C++做项目这样的问题,介绍了SVN的使用,常见功能的快捷方式,VC配置等等。接下来就是最后的一些与调试相关的东西与大家分享。另外强烈推荐对基本VC调试技术不熟悉的朋友去看看《Visual C++ 2005入门经典》的第十章。 

断点

没有比断点更常用的了,通过点击代码左边边栏或者移动光标到指定行按F9等都可以添加断点。值得注意的是并非每一行都可以添加断点,这个就留给大家去实践中体会吧。

通过菜单》调试》窗口》断点或者直接按Alt+F9可以调出断点选项卡,通过选项卡我们可以设置条件断点、数据断点等。 

单步和监控

调试中除了F5之外,另外更常用的估计是F10、F11了,前者是一次一个语句的执行,或者可以看出一行;而后者如果出现能进入的子过程,那么就会进入子过程。这个请大家找个程序,至少要有函数调用的,当断点触发的时候,请自行体验一下F10和F11的效果你就明白了。说白了,实践才是最好的老师,我负责告诉你有这么个东西。 

两个选项卡,局部变量和自动变量,它们都负责显示一些当前断住状态下的变量的值,注意,这些只有在程序中断的时候才有意义。自动变量选项卡并非指auto变量,而是指VS帮我们猜想我们可能感兴趣的一些变量的值,或者函数返回值,而局部变量基本上就是本过程的一些变量的值了。

注意,这些选项卡不仅仅可以用于查看,甚至可以用于你临时修改它们的值,方法就是双击值就可以了,如下图所示: 

这时候你可以把它临时改成false都行哈。

大家看到监视1了吗?这个选项卡是留给用户的,如果前面的变量太多你不想用滚动条滚来滚去的看就可以在这里输入要监视的变量了: 

这里我检查了当前语言字符串的设置。注意并非什么变量都可以检视,必须是调试器可以为我们推断出来的才行,即调试器知道它的地址是什么。如上图所示有一个特殊的用法$err,hr这个是VS特别的,它的意义相当于让调试器帮你获取GetLastError的值,这在Windows编程的时候非常有用。

对于一些指针类型的变量我们还可以在监视里面对它做强制转型,比如你的函数传递一个void* p进来,但是你知道这次你传递的是一个Data结构体的指针,而调试器是无法知道这个p指向的是Data,所以你可以在监视中输入(Data*)p。这样调试器会自动帮我们把他当做Data结构体的指针来识别。

调用堆栈

调试过程中调用堆栈实在是太重要了,因为它指出了你的程序是正在处于什么状态,是谁调用了谁: 

如果你没有这个选项卡可以通过Alt+7或者调试》窗口》调用堆栈把它调出来。

运行时也可以获取调用堆栈的,这个需要Windows API的帮助,这个请看我写的这个。

日志

日志有很多种,你可以写一个专门的日志系统来处理日常的日志工作,但是这里我只说把信息数出到VC的输出窗口,像这样: 

使用Windows API OutputDebugString来实现,当然你也可以对他做一些封装,在程序中在重要的代码部分记录下日志,这对调试很有帮助,你这样会一眼知道哪里出了问题,甚至你可以把调用对战嵌入到这个包装中去:

通过模块选项卡发现外部模块错误

假设我们依赖于一个外部库Test.dll,这个DLL在系统目录下面有一个,而在Path路径下面还有一个,而他们的版本不同,甚至只是名字相同而内容完全不同。或者其他一系列的类似的问题,都可以通过模块选项卡来察觉,另外这个模块选项卡还告诉了我们我们依赖了那些外部DLL,这在发布的时候很有用,使得我们可以漏掉需要的DLL。

通过暂停按钮发觉死锁和死循环

当我们的程序失去响应的时候我们不妨尝试点击调试窗口上面的暂停按钮: 

如果中断(暂停)成功那么我们会看到死锁或者死循环的调用堆栈了。

断言(assert) 
  assert大家应该很熟悉了吧,这是最直接提供错误信息的方法了。特别的,当我们在调试的时候,调试器会帮助我们定位到断言触发的地方。

暂时就想到这么多,如果您还有其它好Case,一定不要忘了要同大家分享。

转眼间毕业一年了,感触良多。每当我情绪低落的时候,我就看苏珊大妈的视频,因为苏珊大妈是我的偶像,因为她告诉我有梦想就一定要坚持,当你具备了成功的基础的时候,梦想就会慢慢的实现。

寻梦不止,学习不止。天行健,君子以自强不息;地势坤,君子以厚德载物。

 
 

《Visual C++ 2010入门教程》系列六:VC2010常见调试技术的更多相关文章

  1. 《Visual C++ 2010入门教程》系列四:VC2010中初学者常见错误、警告和问题

    <Visual C++ 2010入门教程>系列四:VC2010中初学者常见错误.警告和问题   这一章将帮助大家解释一些常见的错误.警告和问题,帮助大家去理解和解决一些常见问题,并了解它的 ...

  2. 《Visual C++ 2010入门教程》系列一:关于Visual Studio、VC和C++的那些事

    原文:http://www.cnblogs.com/Mrt-02/archive/2011/07/24/2115606.html 作者:董波 日期:2010.6.15 写在前面 在我还在上学的时候,我 ...

  3. 《Visual C++ 2010入门教程》系列三:关于C++的一些问题

    <Visual C++ 2010入门教程>系列三:关于C++的一些问题   这一回我自己都不知道应该写点什么好,或许今天的篇幅会比往常短很多.我说过,这不是C++的教程,因为我还没有那个能 ...

  4. 《Visual C++ 2010入门教程》系列二:安装、配置和首次使用VS2010

    作者:董波 日期:2010.6.15 写在前面 在我还在上学的时候,我选择了C++,最初我用VC6作为我的IDE,我看过很多本C++的教材,有的适合我,有的不适合我,其中有一本叫<Visual ...

  5. Visual C++ 2010入门教程

    <Visual C++ 2010入门教程>系列一:关于Visual Studio.VC和C++的那些事   作者:董波 日期:2010.6.14 写在前面 在我还在上学的时候,我选择了C+ ...

  6. 《Visual C++ 2010入门教程》系列五:合理组织项目、使用外部工具让工作更有效

    原文:http://www.cnblogs.com/Mrt-02/archive/2011/07/24/2115631.html 这一章跟大家分享一些与c++项目管理.VAX.SVN.VS快捷键等方面 ...

  7. WPF入门教程系列六——布局介绍与Canvas(一)

    从这篇文章开始是对WPF中的界面如何布局做一个较简单的介绍,大家都知道:UI是做好一个软件很重要的因素,如果没有一个漂亮的UI,功能做的再好也无法吸引很多用户使用,而且没有漂亮的界面,那么普通用户会感 ...

  8. WCF入门教程系列六

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  9. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

随机推荐

  1. flume介绍及应用

    版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: http://www.cnblogs.com/sxt-zkys/QQ技术交流群:299142667 flume的概念 1.   ...

  2. Leetcode 319.灯泡开关

    灯泡开关 初始时有 n 个灯泡关闭.第 1 轮,你打开所有的灯泡.第 2 轮,每两个灯泡你关闭一次.第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭).第 i 轮,每 i 个灯泡切换 ...

  3. CD(01背包)

    You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is o ...

  4. CodeForces 606C--Sorting Railway Cars,思路题~~~

    C - Sorting Railway Cars   Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d &am ...

  5. j_spring_security_check 404错误

    折腾了好久,还是写一篇备忘 折腾了好久,还是写一篇备忘 首先检查路径 <form class="form-signin" method="POST" ac ...

  6. 《APP开发》APP规范实例-详细的UI设计方法

    对了一个APP开发初手来说,可能心里有很多的疑惑: 屏幕设计为多宽,宽度是不是应该设置为百分比; 按钮大小多大,怎么排列,文字字体用多大的?什么字体显示好看?图标多大,怎么用色?界面怎么布局?等等很多 ...

  7. Match the string--hdu1797(模拟)

    http://acm.hdu.edu.cn/showproblem.php?pid=1797 就是模拟 我的思路是标记aba 和h的位置 然后就判断是否正确  就行了 还有就是  最后 fkfkfkf ...

  8. Failed to load session “ubuntu" 问题解决总结

    最近在用Ubuntu系统,但因为手欠,将unity-2d给删除了,导致总是进不了图形界面,登陆之后显示failed to load session "ubuntu“,返回之后又回到登录界面. ...

  9. 【深度探索C++对象模型】data语义学

    class X{}; class Y :public virtual X{}; class Z :public virtual X{}; class A :public Y, public Z{}; ...

  10. 一个重绘MFC的文件传输client

     一个重绘MFC的文件传输client,TCP/IP协议的文件传输client(支持上传.下载.续传.管理等功能,本处仅仅选择了上传功能).从用户视觉上看,肯定比原生MFC界面要有感觉,啥也不说了 ...