当前位置:
文档之家› 实验3:认识程序调试方法和工具
实验3:认识程序调试方法和工具
Debug 工具栏
单步执行
变量窗口
Watch 窗口
图 2 跟踪执行 运行出函数(Step Out) :按 Shift+F11 或对应命令按钮,运行程序,当 遇到断点或返回函数调用者时暂停。 运行到光标(Run to Cursor) :按 Ctrl+F10 或对应命令按钮,运行程序, 当遇到断点或光标时暂停。 (3)查看程序运行状态:当程序暂停时,可利用变量窗口观察和修改当前运行 环境所涉及的变量的值,以便发现程序是否按设计者的意图进行变化。而 Watch 窗口还可用来观察你感兴趣的表达式的值。变量窗口和 Watch 窗口可用 Debug 工具栏中相应命令按钮来打开或关闭。 通过上面的内容,我们了解了调试程序的几个武器。下面这些武器帮助 我们进一步理解和掌握所学知识: 程序执行流程 形参和实参的存储 形参和实参的单向值传递的方式 (4)单步运行程序,观察程序的执行流程和状态: ①按 F10,以调试状态运行程序。从图 3 可以看出,无论 main 函数处在程序 何处,程序运行总是从 main 函数开始执行的。main 函数是程序的入口。此时, 还未进入函数体,变量还未定义,因此变量窗口是空的。
对 程 温 温馨 馨提 提示 示: : 对于 于初 初学 学者 者, , 程序 序出 出错 错是 是不 不可 可避 避免 免的 的事 事情 情。 。面 面对 对编 编 译 产 也 毕 译器 器提 提示 示的 的众 众多 多错 错误 误, , 产生 生一 一点 点儿 儿畏 畏难 难情 情绪 绪, , 也是 是可 可以 以理 理解 解的 的, , 毕竟 竟 程 事 程序 序排 排错 错是 是困 困难 难的 的。 。 事实 实上 上, ,只 只要 要学 学会 会了 了一 一定 定的 的程 程序 序测 测试 试和 和排 排错 错技 技巧 巧, , 错 相 发 错误 误就 就不 不再 再可 可怕 怕了 了。 。 相反 反, , 发现 现的 的任 任何 何错 错误 误都 都能 能教 教导 导我 我们 们如 如何 何防 防止 止类 类 似 似错 错误 误的 的再 再次 次发 发生 生, ,即 即使 使发 发生 生, ,我 我们 们也 也可 可以 以尽 尽早 早识 识别 别它 它。 。本 本次 次实 实验 验, , 我 在 请 我们 们学 学习 习了 了程 程序 序调 调试 试和 和排 排错 错的 的基 基本 本方 方法 法。 。 在今 今后 后的 的学 学习 习中 中, , 请大 大家 家不 不 断 断应 应用 用它 它们 们, ,积 积累 累经 经验 验, ,努 努力 力提 提高 高自 自己 己的 的程 程序 序调 调试 试能 能力 力。 。
图 6 形参的存储和传递 图 6 表明程序当前运行环境是在函数 Add 中,变量窗口显示的是形参 x,y 值,而 Watch 窗口中显示了形参 x,y 的地址值,它们显然和图 4、图 5 中显示的 main 函数中实参 x,y 的地址值不同。实参、形参变量虽同名,但所占内存不同。 ④按 F10 继续单步运行程序,直至返回 main 函数。特别观察下图 7 中标注的 内容,并用所学知识加以解释。
《C 语言程序设计》实验指导书
实验 3 认识程序调试方法和工具
一、 实验目的
【知识点】
பைடு நூலகம்
1. 2. 3. 4.
掌握自定义函数的定义、声明和调用的方法; 掌握实参、形参的概念和单向值传递的方式; 掌握函数参数、返回值的设计的原则; 进一步掌握指针变量的应用。
【技能】
1. 掌握增设打印语句调试程序的方法; 2.掌握断点设置、单步运行、变量观察等调试工具的使用方法。
温 温馨 馨提 提示 示: :请 请按 按下 下面 面的 的步 步骤 骤继 继续 续完 完成 成实 实验 验, ,在 在这 这个 个过 过程 程中 中, , 你 你将 将领 领会 会一 一种 种有 有效 效的 的程 程序 序调 调试 试方 方法 法— —— —关 关键 键位 位置 置加 加设 设打 打印 印语 语句 句! !
图5
执行 scanf 语句后
4
《C 语言程序设计》实验指导书
从图 5 可以看出,scanf 语句输入的数据 5,6,分别对应存放到变量 x,y 所占空 间,变量值被修改。scanf 函数的返回值为 2,表明有两个数据正确接收。 ③按 F11,跟踪到函数 Add 内。观察变量窗口的变化。在 watch 窗口增加表达 式&x 和&y,比较图 6 中&x 和&y 的值和图 4、图 5 中&x 和&y 的值。它们表示的含 义是什么?
6
《C 语言程序设计》实验指导书
printf(“\nMyRand=%d\n”,MyRand); 反复运行程序,你会发现每次生成的是伪随机数,每次都相同。 (2) 在语句 MyRand=rand();前增加: srand(time(0)); 再运行程序看看。 (3)修改上面的代码,生成指定大小范围内(比如 0„100 以内)的一个 随机数。 注意:包含上述库函数涉及的头文件。 3. 小学生算术练习程序 MathLearn: 改进实验 2 中的 MathLearn 函数。要求将键盘输入两个加数,改为由程序自 动生成两个 0„10 范围内的加数。 4. 比较下面的函数,理解指针在函数参数传递中的应用。 将下面三个函数实现两个数据的交换, 把它们添加在 third.c 源程序的后面, 并在 main 函数中调用它们,验证它们是否实现了设计功能? void Swap1(int x, int y) //参数 x,y 为待交换的两个数 { int temp; temp = x; x = y; y = temp; } void Swap2(int *px, int *py) //指针 px,py 指向待交换的两个数 { int temp; temp = *px; *px = *py; *py = temp; } void Swap3(int *px, int *py) //指针 px,py 指向待交换的两个数 { int *temp; temp = px; px = py; py = temp; } 为验证上述三个“交换函数” ,main 函数的大致处理流程如下: ①待交换两个数据 iNum1、iNum2 赋值; ②调用 Swap1 函数; ③显示 iNum1、iNum2,以判断 Swap1 是否实现了设计功能; ④调用 Swap2 函数;
(3)运行程序,按提示输入:5,-6↙,观察程序运行结果。 (4)程序调试。在 scanf(“%d%d”,&x,&y); 输入语句后,增加下面的输出语句: printf(“\ndebug:x=%d y=%d”,x,y); 用以检查输入的数据是否正确接收。 (5)重新运行程序,按提示输入:5,-6↙,观察程序运行结果。 你会发现:变量 y 的值并不是你所期望的-6,问题就出在这里了! 接下来,请你分析原因,找到解决的办法。
跟踪执行
断点设置
图 1 断点设置 (1)设置断点:将光标移到语句 iSum=Add(x,y); 按 F9 或点击图 1 中 按 钮, 将在此处设置断点。 当以调试状态运行程序时, 每次运行到断点所在代码行, 程序就暂停,以便查看程序的状态。
2
《C 语言程序设计》实验指导书
(2)单步跟踪:按 F5 或 命令按钮,以调试状态运行程序。当程序在断 点处暂停,进入单步运行状态。在此状态下,对程序的执行有多种选择。见下图 2。 单步执行(Step Over) :按 F10 或对应命令按钮,执行一行代码。 单步进入(Step Into) :按 F11 或对应命令按钮,执行一行代码,若此行 中有函数调用,跟踪到函数内部,并在函数内部第一行代码处暂停。
1
《C 语言程序设计》实验指导书
2. 调试工具的使用: #include <stdio.h> int Add(int x,int y) { return(x+y); } int main() { int x,y,iSum; printf("Please input two integers x,y:\n"); scanf("%d,%d",&x,&y); iSum=Add(x,y); printf("Sum of %d and %d is %d\n",x,y,iSum); } 将上面的程序保存为 debug.c,并在 VC 集成环境中打开、编译并链接,让我 们先认识几个调试工具。
二、实验要求
1. 复习顺序结构程序设计的一般步骤。 2. 复习函数定义、声明、调用的方法。 3. 完成各项实验任务及问题讨论。
三、实验内容
在 自己的目录中建立新的 项目 third ;然后 创建一个新源程序文件名 third.c ,将在本实验中,你所编写的所有代码放入该文件。
(一)基础知识部分
从开发者的角度,函数可分为自定义函数和库函数两大类。若程序中调用库 函数,则需将包含其函数原型声明的头文件,使用 include 命令将相应的.h 文 件包含进来。若调用自定义函数,则要符合“先定义,后使用”的原则,在源程 序文件适当的位置,先定义或声明,后调用。 1.库函数的使用 在 third.c 源程序文件中, 编写函数 Input_xy( ): 输入 x, y, 求 z = x + |y| 的 值。(提示:求绝对值可用库函数 abs 或 fabs,头文件:stdlib.h。) 实验步骤与要求如下: (1)void Input_xy( )函数编写要求如下: ①输入前要加提示语句; ②使用语句 scanf(“%d%d”,&x,&y); 输入; ③输出结果前要有必要的文字说明。 (2)在 main 函数中调用 Input_xy( ),以验证程序运行结果是否正确。
图7
函数返回
5
《C 语言程序设计》实验指导书
⑤按 F10 继续单步运行程序,观察变量窗口和 Watch 窗口的变化,直至程序结 束。 3.自定义函数的设计 在 third.c 源程序文件中,编写函数 Area, 求三角形面积。在 main 函数中 输入三角形的三边长 a、b、c,调用函数 Area,输出计算结果。 三角形面积公式:S= p(p - a)(p - b)(p - c) (其中 p=(a+b+c)/2) 实验步骤与要求如下: (1) 按题目要求,设计函数 Area 原型并完成函数定义。考虑: 是否需要参数?参数个数,数据类型 有无返回值?返回值类型 (2)main 函数编写要求: 输入前要加提示语句; 调用 Area; 输出结果前要有必要的文字说明。 (3)程序测试: 输入一组数据 3,4,5,观察运算结果; 输入另外一组数据 3,4,8,观察运算结果; 分析这个运算结果是否有效? (4)使用上面介绍的调试工具,进行程序调试: ①在数据输入以后,设置断点,观察代表边长的变量值是否正常接收; ②Watch 监视窗口,适当增加观察表达式。 ③单步运行程序,观察各观察对象的变化,以期发现原因。