VC++6.0调试工具使用初步

简介: 【摘要】程序设计初者学会IDE(集成开发环境)中提供的调试工具,是一件非常重要的事。本文在初学者有初步的程序设计体验(只需要掌握到控制结构)为前提,介绍了单步执行、断点设置及观察程序运行情况的方法,并配有练习的建议,方便读者的学习。(相关博文:CodeBlocks调试功能快捷教程)  在编写程序中,尤其是完成一个工程的过程中,通过编译的程序往往也会存在错误(bug)。这种错误是运行错误和逻

【摘要】程序设计初者学会IDE(集成开发环境)中提供的调试工具,是一件非常重要的事。本文在初学者有初步的程序设计体验(只需要掌握到控制结构)为前提,介绍了单步执行、断点设置及观察程序运行情况的方法,并配有练习的建议,方便读者的学习。

(相关博文:CodeBlocks调试功能快捷教程


  在编写程序中,尤其是完成一个工程的过程中,通过编译的程序往往也会存在错误(bug)。这种错误是运行错误和逻辑错误,比语法错误更隐蔽,更危险。
  如何找出这些错误?在冗长的代码中,找出这些错误来并不总是一件容易的事。排错(debug)是一件程序员不得不面对的麻烦事,但真正的程序员会把与bug战斗当成自己的神圣使命。
  调试程序是程序员应该具备的基本能力。在学习编写程序过程中,学会调试程序是最实用的技能之一。可以纯粹依靠人工,一行一行,或一块一块地检查,思考,很累人。也可以像现有的各种教材及课堂教学中介绍的,输出变量及中间变量(用输出语句cout<<...;),以观察运行结果及运行的中间结果。这种方法简洁方便,但增加了写代码的维护量,同时,有时并不能方便地找到问题所在。
  在实际的工作中,调试工作常用IDE(集成开发环境,如VC++6.0)提供的工具进行。本文旨在指导同学们初步学会利用VC++6.0调试程序的方法,学会单步运行程序和使用断点的方法,并在过程中观察运行环境(最重要的是变量)的变化,从而在今后能够高效地完成程序的调试。

   一、认识调试功能
  在组建(build)菜单中,点击开始调试(start debug),在其下级子菜单中,包含了启动调试器运行的各项子命令(如图1所示)
  
            图1 开始调试菜单

  各子命令及其功能如下: 
  • Go:从程序中的当前语句开始执行,直到遇到断点(后面讲)或遇到程序结束。
  • Step Into:控制程序单步执行,并在遇到函数调用时进入函数内部。
  • Run to Cursor:在调试运行程序时,使程序运行到当前光标所在位置时停止,相当于设置了一个临时断点。


   二、单步调试代码
  利用图1菜单中的Step into功能或按F11键,进入单步调试状态,有一个箭头指向程序的第一行,每按一次F11键,程序再向前执行一行语句,如图2所示。
  
            图2 开始调试后的界面


  我们对图2的界面进行观察。

  首先,菜单中增加一个调试(debug)菜单,如图中①处,下面是菜单中的部分功能(鼠标浮到上面时,会有提示,请试一试。)
  • Step Into(F11):单步调试程序,遇到调用函数时,进入函数内部逐步执行;
  • Step Over(F10):也是单步调试程序,遇到调用函数时,并不进入函数内容执行;
  • Step Out:调试程序时,从正在执行的某个嵌套结构的内部跳到该结构的外部,常用于知道调用函数中不存在错误的情况;
  • Run to Cursor(CTRL-F10):调试程序时,直接运行到插入点处。

  其次,和当前正在执行的语句相关的变量,以及其当前的值显示在了②处。 

  再次,黄色箭头代表了正在执行的位置。


  【练习1】

  下面,针对求1+2+3+...+100的程序,体验单步执行。步骤:
  (1)编写如图所示求1+2+3+...+100的程序,排除编译错误;
  (2)按前述开始单步执行,用“Step Into(F11)”持续执行,在执行过程中,注意观察变量的变化。
  • 调试中,要将自己的预期和计算机执行的结果进行比较,当发现不一致,恭喜,问题找到了。
  • 本程序循环要执行100次!有的程序进入循环要执行的次数更多,而初步跟踪确定循环不可能出问题,需要快速“跳出”循环。将光标移到循环后,用“Run to Cursor”,程序即运行到光标处。
  • 在cout<<...一行继续F11,会吓人一跳,出现的界面是:
  
     图3 程序会运行到“看不懂”的代码中去,用Step Out功能退出
  这是因为F11的单步运行,进入到了实现cout功能的代码中去了(教训:以后再到这儿,切记用Step Over(F10),而不是Step Into(F11)),此时请用Step Out功能可以退出。

  【练习2】再将上面的过程进行几遍,熟练上述过程,学会观察,会灵活使用Step Over(F10)、Step Into(F11)、Step Out和Run to Cursor处理。

  提示:Step Over(F10)和Step Into(F11)的区别将在学习函数后更加明确,需要跟踪自定义函数内部代码时,用Step Into(F11),不需要跟踪时,就Over过去了。

  【练习3】将光标置于程序中某一语句上,用Run to Cursor(快捷键CTRL-F10),看看发生什么现象——直接执行到了光标处!这是一种快速观察的方法。(PS:本练习受1楼博友留言启发加上,表示感谢。)


   三、设置断点和断点应用
  断点是程序执行需要中断的地方。可以让程序中断在需要的地方,从而方便其分析。
  有两种设置断点的方法,如图4所示:
  • 将光标移到需要设置断点的程序行,点击工具栏上的“手型”按钮设置断点。
  • 利用鼠标右键设置:在程序行前的空白栏内点鼠标右键,选择菜单中的Insert/Remove Breakpoints选项可以设置断点。
  
          图4设置断点及相关工具


  设置了断点的程序行前会出现一个黑色的实心圆圈。

  取消断点用同样的按钮和菜单。
  Go(F5)命令从程序中的当前语句开始执行,直到遇到断点(后面讲)或遇到程序结束。

  【练习4】在程序中随意设置和取消断点(一个程序中可以根据需要设置多个断点),然后用Go命令(F5)执行,观察变量及程序流程的变化。
  技巧:在调试的过程中,可以直接使用Run to Cursor,从而避免多次的用Step Into/Over等命令。如果设置了断点,直接运行程序就可以在断点处停止,从而避免程序员总得关注光标的位置。一个程序中可以设多个断点,这也为程序员提供了方便。

  四、用好快捷键和“调试”工具栏
  在使用中记住各功能的快捷键,这将提高你的工作效率。快捷键可以从菜单中看到。
  可以在工具栏处点右键,选择“调试”工具栏,如图5,工具栏也可以方便你的工作。
  
  图5 调试工具栏

  【练习5】将工具栏中的功能都点一点,看一看,想一想,但不求甚解。随着学习的深入,我们会逐步掌握。

   五、程序调试方法小结
  上面仅介绍了程序调试的基本方法,但灵活运用可以为编写出正确的程序提供强大的支撑。
  随着经验的增加,简短且算法简单的程序你可能凭观察就知一二。对需要观察其运行过程的程序,可以这样做:
  • 增加必要的断点(当然,嫌疑解除后去除断点);
  • 如果必要,添加监视,以便于观察一些表达式的值;
  • 用Step Into、Step Over、Step Out或Run to Cursor等的组合,跟踪程序执行的过程
  • 在运行过程中,和自己对运行结果的预期结合起来,思考程序可能出现的问题。
  • 需要退出程序时,使用调试菜单中的“Stop Debugging”选项终止执行。这时再修改程序。
  • 如果程序执行异常,一定要告诉自己:程序中一定有bug,不是机器的错,我得找出bug来,Bug也一定会被你找出来。

【实践1】利用单步执行、设置断点等手段,观察下面程序执行的过程

1.

#include <iostream>
using namespace std;
int main()
{
   int a=1,b=2,c=3;
   if(a<=c)
     if(b==c)
       cout<<"a="<<a<<endl;
     else
       cout<<"b="<<b<<endl;
   cout<<"c="<<c<<endl;
   return 0;      
}

2.

#include <iostream>
using namespace std;
int main()
{
    int x=1,a=0,b=0;
    switch (x)  
    { 
       case 0: a++; break;
       case 1: b++;
       case 2: a++; b++; break;
       case 3: a++; b++;
    }
    cout<<"a="<<a<<",b="<<b<<endl;
    return 0;
}


3.
#include <iostream>
using namespace std;
 int main ( )
{  
	int  i , j, s=0;
	for (i=1; i<=4; i++)
	{
		for( j=1; j<=i; j++)
			s=s+1;
	}
	cout<<”s=”<<s<<endl;
	return  0;
}

4.
#include <iostream>
using namespace std;
 int  main()  
{
	int number=1024,digit;
	do
	{
		digit=number%10;
		number=number/10;
		cout<<digit;
	} while(number>0);
	cout<<endl;
	return 0;
}

  【实践2】选择一个你以前做的程序,请你的同学在你的程序中作两处改动,使其可能会造成逻辑错误(如两数交换的程序中将a=b;和b=t;两条语句换一下顺序),你利用自己的思考和调试工具将程序改正过来。



   

目录
相关文章
|
12天前
|
Web App开发 监控 JavaScript
调试器可以做什么
【4月更文挑战第11天】调试器是程序员诊断和修复程序错误的必备工具,提供执行控制(如逐行执行、设置断点)、变量值实时监控、函数调用堆栈跟踪、内存使用情况监视及异常处理等功能。JavaScript开发者可利用Chrome DevTools和Firefox DevTools等进行高效调试。调试器极大地助力了问题定位与修复。
18 5
|
10月前
|
运维 监控 数据可视化
JVM调试命令与调试工具
JVM调试命令与调试工具
177 0
|
10月前
|
存储 监控 算法
代码调试技巧
代码调试技巧
|
11月前
|
Web App开发 前端开发 JavaScript
记一次chrome插件调试
记一次chrome插件调试
|
缓存 小程序 JavaScript
如何使用谷歌浏览器调试工具
如何使用谷歌浏览器调试工具
249 0
如何使用谷歌浏览器调试工具
|
Java C# 开发工具
9个最好用的在线编译/调试工具
电脑没有C/C++的开发环境了,只能找找在线的编译器。。IDEone不错。。。 本文要推荐9个最好用的在线编译器,以下顺序不按排名先后: 1、ideone 可以在线编译、调试C/C++,JAVA,PHP,Python,Perl,以及其他40多种编程语言。
2635 0
|
Web App开发 测试技术 PHP
如何本地安装ApiPost接口调试工具
本文主要讲在谷歌应用商店不能访问(不可描述的原因)的情况下,如何安装apipost拓展。
|
C# C++ Windows
WinDbg 调试工具的使用
概述 项目接近尾声了,可是在运行时会有memory leak(内存泄露) bug.产品在运行一天后,内存增长致1.4G,而我们产品的初始内存才有70M,问题很严重,决定采用WinDbg工具来分析代码问题有原因到底在哪里. WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
850 0
|
应用服务中间件 nginx