VC++6.0 Debug单步调试
相信大家对谭浩强童鞋都不陌生,想当年,是他 引领我们步入了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”和“重新阅读代码并思考”是很重要的方法。确实,有时候调试工具的单步调试会让你局限于细节,而没有从整体上去观察思考代码。不过 有时候调试工具也能给我们带来很大帮助。也许两者结合起来会让调试更加有效率吧)
- 自变量顺序错误。(注意参数命名,以避免颠倒顺序。实参和形参用相同的名字会调理清晰)
- 拼写错误。
- 忘记初始化。
- 对象与值相等。“==” 与" = "
- 别名。数组、链表的深度复制和浅复制。
- 副作用。函数执行过程可能会改变一些变量的值。
- 收集自己经常犯的错误,调试时先从易犯的错误下手。
- 记录你尝试过的修改,调试用的“print”可以注释掉而不是删除。
- 调试别人代码的时候,调试的是代码,而不是注释。不要被注释所迷惑。
- 寻求帮助。旁观者清,寻找别人帮助,尽可能向别人解释清楚自己的程序,也许你在解释的过程中就能发现错误了。
- 清醒一下大脑。
- 欲速则不达。考虑好修改方案,而不是急功近利。修改这个bug的过程可能会产生更多的bug。
- 代码不能总是变长。代码写的越多,出错误的可能就越大。当你遇到问题时,试着把你的代码整理一下,整理的过程中也许你就可能找到错误。
- 及时备份旧版本代码。确保你的代码能够回到Debug前。没有什么比你Debug 4个小时,最后发现还没有4个小时前好,更令人沮丧的是你不能回到最开始的状态。硬盘空间很廉价,多保存一下旧版本的代码绝对没有坏处。
VC++6.0 Debug单步调试的更多相关文章
- 自己编写的基于VC++6.0的串口调试软件,并贡献源程序!
自己编写的基于VC++6.0的串口调试软件源程序! 程序下载链接: 点击打开链接
- VC++6.0环境下调试c语言代码的方法和步骤_附图
1.C语言程序四步开发步骤 (1)编辑.可以用任何一种编辑软件将在纸上编写好的C语言程序输入计算机,并将C语言源程序文件*.c以纯文本文件形式保存在计算机的磁盘上(不能设置字体.字号等). (2)编译 ...
- python Debug 单步调试
一直犯愁的是python的调试,曾经写c都是编译完了用gdb直接调试了,轻松愉快.如今遇到这么一个解释型的程序.不知道怎么办了.用log吧,有时就是一个小程序,不想写这么多代码.打屏吧.有时屏幕翻得快 ...
- Pycharm的debug单步调试
首先设置断点,点击行号显示的一侧,在指定行设置断点.比如这里,我们设断点在创建对象时: .如果这时我们直接右键run这个代码.他还是会直接运行,不会理会断点 结果 所以要右键选择run下面的debug ...
- 自己动手实现java断点/单步调试(二)
自从上一篇<自己动手实现java断点/单步调试(一)> 是时候应该总结一下JDI的事件了 事件类型 描述 ClassPrepareEvent 装载某个指定的类所引发的事件 ClassUnl ...
- VC++ 6.0远程调试配置
VC开发环境之所以提供远程调试的能力,是因为有些情况下单机调试会让你崩溃掉...比如,调试GUI程序的WM_PAINT消息,因为要单步调试,所以调试器会对界面的重绘产生副作用(Heisenberg不确 ...
- VC++6.0远程调试(亲试成功)
0 前言 VS2008及以上远程调试上篇已经讲过,这里再讲下VC++6.0开发环境下的远程调试能力,仅需下面4步即可,更方便的就接着后面的5-6步. 因为目标程序需要在有采集卡等相关硬件支持下的工控机 ...
- Intellij idea远程debug连接tomcat,实现单步调试
转载:http://blog.csdn.net/boling_cavalry/article/details/73384036 web项目部署到tomcat上之后,有时需要打断点单步调试,如果用的是I ...
- VC++6.0 IDE的工程用Code::Blocks来打开、编译、调试终极配置方案
本篇文章转自 CSDN blog,转载请注明出处! 原文地址: http://blog.csdn.net/liquanhai/article/details/6618300 引子:竟然可以用Code: ...
随机推荐
- php开发api接口
做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨 ...
- [转]行者,一念一生,成功的背后!(给所有IT人)
成功的背后,有着许多不为人知的故事,而正是这些夹杂着泪水和汗水的过去,才成就了一个个走向成功的普通人. 凌晨两点半,早 已习惯了一个人坐在电脑前的我,望着屏幕,任思绪在暗夜的包容下静静流淌,时光仿佛又 ...
- Mysql对用户操作加审计功能——初级版
在某些应用里,需要知道谁对表进行了操作,进行了什么操作,所为责任的追朔.在MYSQL里,可以使用触发器实现. 1:创建测试表 mysql> create table A(a int);Query ...
- 钉钉的收费 [钉钉深圳研发团队 denny/2016.01.06/ 59888745@qq.com]
普通用户(个人) 团队 企业 1.免费额度为每月通话100分钟.每天发DING 5次. 1. 每月通话300分钟,每天发DING 10次. 2. 群组最多可达1500人 1. 该公司所 ...
- 如何查看oracle数据库告警日志
目标:查看alert日志 su - oracle cd $ORACLE_BASE/diag/rdbms/LXY/LXY/trace tail -100f alert_LXY.log 我的ORACLE_ ...
- 开放地址法实现HashTable
前注:本文不是讲解Java类库的Hashtable实现原理,而是根据计算机哈希表原理自己实现的一个Hashtable. HashTable内部是用数组存放一个(Key-Value pair)键值对的引 ...
- X-Cart 学习笔记(三)X-Cart框架2
目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 3.了解 ...
- JS和CSS关于大小写的区分
方法: document.getElementById("xx").style.xxx中的所有属性是什么 盒子标签和属性对照 CSS语法(不区分大小写) JavaScript语法( ...
- Mac后台开发MNMP(nginx , mysql, php)标配
mysql安装: 方法:1.原始方法,下载压缩文件,解压,安装,配置 2.dmp文件安装 3.brew安装 这里使用brew安装: a.brew ...
- C# 控制台程序如何能不显示窗口
创建好控制台程序后,选中项目,右键,属性,输出类型选为“windows 应用程序” 这样就没有dos窗口了