相信大家对谭浩强童鞋都不陌生,想当年,是他 引领我们步入了C的殿堂,我们从他那里学会了如何写代码,他却没有教我们如何Debug,而我们伟大的老师,也对此只字不提。相信很少有人可以一次性写出 完全正确的代码。对于我们这些个菜鸟来说,写出不带bug的代码倒是一件很不正常的事情。也许你知道有Debug这么个东西,但却不知道该怎样用;也许你 还停留在在代码中添加N个printf来输出查看到底是哪里出了问题;也许……总之,经验表明,你花费时间看完这篇文章并学会简单的使用Debug,绝对 不是浪费时间!

废话少说,进入正题:

编译0 error(s), 0 warning(s)

链接0 error(s), 0 warning(s)

当你按捺不住激动滴心情点击运行后,发现结果并不是你想要的结果……郁闷了。然后你在代码中加了n条printf来查看 变量的结果……n多循环……运行,再加printf,again and again……终于,要抓狂了……

好吧,同学,如果你会用Debug,也许你不用这么纠结。

下面通过一简单例子说明如何使用Debug的一些“基本”(我也只是刚入门的小菜鸟,高级的修行要靠自己的了)功能:

写了如图中的一个简单程序,编译链接都没有错误,运行结果却不理想(不正确)

需要指出的是,主函数不要再用void main()了,这种只有在你学的环境才不会出错,到别的(linux编译器)地方编译是通过不了的。main函数必须要有返回值,如写成int main()在函数结尾时加一个return 0;,这样,所有编译器都不会报错了。

最终结果确定是逻辑错误,如果不用单步调试,很难找出这种错误的。

这里先提到一个断点的概念,顾名思义,既是在你需要的地方让它断开,如果你在某一行代码处添加了断点,那么程序运行到断点处即会暂停,不再继续往下运行,直到接到你继续运行的命令。

对上边示例的程序,在你感觉可能有问题的地方添加断点(按快捷键F9或者点击图中小手按钮),以便运行到断点处好查看运行状态。

值得注意的是,主函数调用的函数,只当作一步,如果你需要检查被调用的函数有没有问题,那么你需要在被调用的函数中添加断点,这样才能一步一步执行被调函数。

2012-07-21更新:上边划掉的部分以前就发现有点没解释清楚,一直没来得及更正。现更正下

之 前只知道一个F10,所以解释成了遇到函数会认为是一步直接过去{ } ,得到返回结果。其实可以从调试的菜单中看到,F10是step over ,意思就是跳过{ } 图标上也有形象的表示,仔细看还有一个F11  是 step into,即进入{ } 内的意思,这下就可以解释清楚了为什么会跳过去,还有其它的更多的快捷键,需要大家自己研究了,常用的也就这几个吧。

在需要的地方添加完断点后(其实,在每个函数第一个需要停下来的地方添加断点就可以了,剩下的地方都可以用F10单步执行,某些已经验证过正确的函数,就不需要每次进行单步查看了  验证过的函数等可以按F10 跳过,想要进入其内部可按F11……)

添加完断点,按F5或者下图中的调试按钮,即可出现调试界面。如下图所示。同时出现的还有一个黑色的窗口,相信你不陌生,在某些需要输入数据的地方,可以在那个黑色窗口中输入。

图中箭头所指的既是当前要运行的位置。左下窗口动态显示参与当前行运行的变量及其值,运行是变量值发生改变的会用红色标出。右边窗口中,你可以输入要查看的变量,它将一直显示在那里,等于是对左边动态显示的一个补充吧,对需要长期监视的变量很有用。

F10即可进行单步运行,每按一下执行一步。你可以观察每一步,每个变量的状态。

观察一圈发现,i的值总是大于j的,而第三重循环for(k=i;k<j ;k++)是永远无法进入循环的。因此找到了问题的症结,该怎么改,就看程序设计的初衷了。

像这种逻辑错误,不用单步调试,很难发现。即使用Debug也需要很长时间和耐心才可以找到,因此,我们编程时应该尽量避免这种逻辑上的错误出现。

调试过程中你可以直接修改代码,下一次运行到这里会按新的代码执行。调试完成想要退出Debug,你会发现,关那个黑窗口并不好使。直接在调试菜单中选择Stop Debugging吧,这样才会安全退回到你原来的编辑界面。

罗哩罗嗦一大堆,不知道你是否看明白了。也许明白的人也被我给说糊涂了。如果你看了这篇文章,感觉有些作用或者感觉很垃圾或者你有什么建议,都期待你能留下些什么……这是一个帮我改正错误的一个很好的方法。


PS:2011-07-28补充:

最近看《麻省理工:计算机科学编程导论》的时候讲到调试时需要注意的事情。感觉挺好,特记录下来。(另,课程中提到,“print”和“重新阅读代码并思考”是很重要的方法。确实,有时候调试工具的单步调试会让你局限于细节,而没有从整体上去观察思考代码。不过 有时候调试工具也能给我们带来很大帮助。也许两者结合起来会让调试更加有效率吧)

    1. 自变量顺序错误。(注意参数命名,以避免颠倒顺序。实参和形参用相同的名字会调理清晰)
    2. 拼写错误。
    3. 忘记初始化。
    4. 对象与值相等。“==” 与" = "
    5. 别名。数组、链表的深度复制和浅复制。
    6. 副作用。函数执行过程可能会改变一些变量的值。
    7. 收集自己经常犯的错误,调试时先从易犯的错误下手。
    8. 记录你尝试过的修改,调试用的“print”可以注释掉而不是删除。
    9. 调试别人代码的时候,调试的是代码,而不是注释。不要被注释所迷惑。
    10. 寻求帮助。旁观者清,寻找别人帮助,尽可能向别人解释清楚自己的程序,也许你在解释的过程中就能发现错误了。
    11. 清醒一下大脑。
    12. 欲速则不达。考虑好修改方案,而不是急功近利。修改这个bug的过程可能会产生更多的bug。
    13. 代码不能总是变长。代码写的越多,出错误的可能就越大。当你遇到问题时,试着把你的代码整理一下,整理的过程中也许你就可能找到错误。
    14. 及时备份旧版本代码。确保你的代码能够回到Debug前。没有什么比你Debug 4个小时,最后发现还没有4个小时前好,更令人沮丧的是你不能回到最开始的状态。硬盘空间很廉价,多保存一下旧版本的代码绝对没有坏处。

VC++6.0 Debug单步调试的更多相关文章

  1. 自己编写的基于VC++6.0的串口调试软件,并贡献源程序!

    自己编写的基于VC++6.0的串口调试软件源程序! 程序下载链接: 点击打开链接

  2. VC++6.0环境下调试c语言代码的方法和步骤_附图

    1.C语言程序四步开发步骤 (1)编辑.可以用任何一种编辑软件将在纸上编写好的C语言程序输入计算机,并将C语言源程序文件*.c以纯文本文件形式保存在计算机的磁盘上(不能设置字体.字号等). (2)编译 ...

  3. python Debug 单步调试

    一直犯愁的是python的调试,曾经写c都是编译完了用gdb直接调试了,轻松愉快.如今遇到这么一个解释型的程序.不知道怎么办了.用log吧,有时就是一个小程序,不想写这么多代码.打屏吧.有时屏幕翻得快 ...

  4. Pycharm的debug单步调试

    首先设置断点,点击行号显示的一侧,在指定行设置断点.比如这里,我们设断点在创建对象时: .如果这时我们直接右键run这个代码.他还是会直接运行,不会理会断点 结果 所以要右键选择run下面的debug ...

  5. 自己动手实现java断点/单步调试(二)

    自从上一篇<自己动手实现java断点/单步调试(一)> 是时候应该总结一下JDI的事件了 事件类型 描述 ClassPrepareEvent 装载某个指定的类所引发的事件 ClassUnl ...

  6. VC++ 6.0远程调试配置

    VC开发环境之所以提供远程调试的能力,是因为有些情况下单机调试会让你崩溃掉...比如,调试GUI程序的WM_PAINT消息,因为要单步调试,所以调试器会对界面的重绘产生副作用(Heisenberg不确 ...

  7. VC++6.0远程调试(亲试成功)

    0 前言 VS2008及以上远程调试上篇已经讲过,这里再讲下VC++6.0开发环境下的远程调试能力,仅需下面4步即可,更方便的就接着后面的5-6步. 因为目标程序需要在有采集卡等相关硬件支持下的工控机 ...

  8. Intellij idea远程debug连接tomcat,实现单步调试

    转载:http://blog.csdn.net/boling_cavalry/article/details/73384036 web项目部署到tomcat上之后,有时需要打断点单步调试,如果用的是I ...

  9. VC++6.0 IDE的工程用Code::Blocks来打开、编译、调试终极配置方案

    本篇文章转自 CSDN blog,转载请注明出处! 原文地址: http://blog.csdn.net/liquanhai/article/details/6618300 引子:竟然可以用Code: ...

随机推荐

  1. 网站tomcat配置

    <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF ...

  2. Nginx 负载均衡学习

    nginx作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至 tomcat服务器. nginx负载均衡服务器 tomcat1服务器 tomcat2服务器 1.1   ...

  3. 27个知名企业品牌VI视觉识别系统规范手册

    Apple公司视觉设计规范 微软公司VI视觉系统 星巴克企业视觉规范手册 DELL品牌VI视觉手册 MTRADING品牌视觉规范 KFC视觉设计规范手册 麦当劳视觉规范 LEGO乐高玩具的品牌视觉规范 ...

  4. Geneve: Generic Network Virtualization Encapsulation

    Earlier this year, VMware, Microsoft, Red Hat and Intel published an IETF draft on Generic Network V ...

  5. 报错:HTTP Status 404 - There is no Action mapped for namespace [/] and action name [product-save] associated with context path [/20161101-struts2-2].

    运行:index.jsp---->input.jsp----->details.jsp,但是在input.jsp到details.jsp的时候报错误. 异常如下: 严重: Could no ...

  6. [ActionScript 3.0] AS3.0将图像的Alpha通道转换为黑白图像(复制通道方式)

    import flash.display.BitmapData; /** * 将图像的Alpha通道转换为黑白图像 */ var p:Point = new Point(0,0); var bmpd: ...

  7. Django TemplateView

    主要功能是渲染模板,看官例: from django.views.generic.base import TemplateView from articles.models import Articl ...

  8. debian8(jessie)安装小记

    其实上周五就想写这篇博客了,一直忙着没时间,虽然也不知道自己这一个星期到底在忙什么.这次我是彻底告别windows了,安装的过程略为艰辛,因为之前习惯了deepin和ubuntu的傻瓜式安装,而deb ...

  9. ReSharper 文件注释

    添加文件注释方法如下: 打开菜单RESHARPER->Options->Code Editing –> File Header Text 如图所示,在其中空白处添加对应文件头注释, ...

  10. 关于对inputstream流的复制

    今天因为项目需要,获取到一个inputstream后,可能要多次利用它进行read的操作.由于流读过一次就不能再读了,所以得想点办法. 而InputStream对象本身不能复制,因为它没有实现Clon ...