C语言课程序调试.ppt_第1页
C语言课程序调试.ppt_第2页
C语言课程序调试.ppt_第3页
C语言课程序调试.ppt_第4页
C语言课程序调试.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8部分-2 程序调试 北京交通大学计算机与信息技术学院 教师: 林友芳 1. 概述 n什么叫调试? n程序没有语法错误,但运行结果不符合期望时 ,采用适当的工具或方法,反复找出程序中存 在的问题,进行修改,最终使程序符合要求的 过程。 n调试是一个程序员必须要掌握的基本技巧 ,对于编写高质量程序非常重要。 n掌握基本的调试技巧对今后的学习、工作 是非常必要的! 北京交通大学计算机与信息技术学院 教师: 林友芳 为什么要调试? n问题 n我的程序跟书上一样,怎么就不出结果呢? n我的程序没错啊,怎么不出结果啊? n我的程序运行结果不正确,如何找到错误? n原因 n程序没有语法错误,不等于就没有语义错误。 n要确保程序没错,必须对程序进行各种测试 2. 解决程序中的错误的方法 北京交通大学计算机与信息技术学院 教师: 林友芳 基本方法人工阅读走查,修改 n程序员一行一行的看程序 n根据实验数据,在脑子里或在纸上模拟程序运 行过程,在脑子里或纸上记录程序中间运行结 果。 n在这过程中发现程序的错误。 n修改发现错误,重新运行测试,如果还有错, 继续查看,修改。 这种方法是最为基本、人人都必须掌握的方法。 以前程序调试手段以少,人们经常只能用用纸、笔和脑来 模拟和记录程序动态运行中的状态。 北京交通大学计算机与信息技术学院 教师: 林友芳 基本方法存在的问题 n这种方法效率不高,属于原始的方法。 n要求程序员具有很强的源程序理解、运行过程记忆、预测 、纠错能力和经验。 n程序员必须用脑子、纸、笔来模拟程序的运行状态 n记录程序的执行进度 n记录所有变量或数据变化过程 n观察和记住执行过程中环境的变化 n程序和模块达到一定规模以后,就很难这样方法调试,效 率太低,难度太大,很难发现问题,很难记录状态变化过 程。 n程序员脑子中的计算与程序实际完成的计算往往有差异, 这样的差异是很难发现的,是很难在纸上体现出来的。 北京交通大学计算机与信息技术学院 教师: 林友芳 采用辅助工具来协助调试 n随着技术的进步,各种IDE的功能越来越强大, 人们在IDE中实现并提供许多功能用来辅助程序 员对程序进行调试。 nIDE的辅助功能 n提供工具让程序员能控制并看到程序的执行进程,如 单步执行,执行到某个位置,进入到某个函数内部执 行, n在执行过程中,提供工具记录、展示甚至修改环境的 状态:变量值,内存数据,函数返回值,程序界面输 出结果, 使程序员不需要再在 脑子中执行程序 使程序员不需要完全只用脑或纸 和笔来记录程序的运行状态,并 保证中间结果的正确性 北京交通大学计算机与信息技术学院 教师: 林友芳 一些值得思考的问题 n为什么集成开发环境能够让程序员调试程 序?是如何做到的? nIDE要能使程序员调试一个程序,需要保存 关于程序的哪些信息? n调试信息 3. 项目配置与调试 Project Configuration and debugging 你是否注意到每个项目中的debug文件夹? 注意,本节有许多很理解的概念,如果暂时看 不懂,可以先跳过去。 北京交通大学计算机与信息技术学院 教师: 林友芳 什么叫项目? n项目即project,指通过设计实现一组程序 完成用户所需功能的工程及过程。 n请查看上机写程序那个课件关于项目 的解释。 n两个概念 nProject settings项目设置 nProject configuration项目配置 北京交通大学计算机与信息技术学院 教师: 林友芳 Project settings n项目具有许多属性,如: n编译结果输出目录 n工作目录 n编译参数 n需要链接的函数库 n编译完以后做什么操作 n编译前要做的操作 n n了解这些属性的意义以后,我们可以对这些属性 值进行设置,以影响编译器的编译行为。 北京交通大学计算机与信息技术学院 教师: 林友芳 Project Configuration n对项目的所有属性的一组设置值统称为一个 Project Configuration,即一组Project Settings统 称为一个Project Configuration. nVC提供两组标准项目设置信息的Configuration模 板 nDebug默认的活跃的项目配置模板 nRelease n很有经验的程序员也可新建不同于这两组标准模 板的项目配置。 北京交通大学计算机与信息技术学院 教师: 林友芳 Set active project configuration n在同一时刻,只能有一个configuration是有效的 或活跃的。 n在Build菜单下选择Set active project configuration. 北京交通大学计算机与信息技术学院 教师: 林友芳 对项目配置的理解 n可以从这个角度来简化理解(不够准确) n每一个project都有一个开发状态,称为debug 与release,得到的编译结果分别称为 nDebug版程序还处于调试状态的程序 nRelease版程序最终提交给用户的可以执行的程 序 n问题 nDebug版与Release版有什么区别? 北京交通大学计算机与信息技术学院 教师: 林友芳 区别 n标准的Debug版的项目配置指示编译器在 编译时,使项目或程序中包含有调试信息 ,对程序不做任何的优化,便于程序员调 试程序。 n标准的Release版的配置指示编译器在编译 时对程序进行优化。得到的结果在代码大 小和运行速度上都是较优的,程序中也不 包含调试信息。 问题:什么叫优化? 为什么不能优化 北京交通大学计算机与信息技术学院 教师: 林友芳 Project Settings 北京交通大学计算机与信息技术学院 教师: 林友芳 选择C/C+页,Category中选择general ,则出现一个Debug Info (调试信息)下拉列表框,可供选择的调试信息 方式包括: 一些编译选项及解释 命令行Project settings说明 无None没有调试信息 /ZdLine Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代 码行信息,不包含符号调试信息 /Z7C 7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息 ,包括变量名及类型,函数及原型等 /ZiProgram Database创建一个程序库(PDB),包括类型信息和符号调试信息。 /ZI Program Database for Edit and Continue 除了前面/Zi的功能外,这个选项允许对代码进行调试过程 中的修改和继续执行。这个选项同时使#pragma设置的 优化功能无效 看不懂可先不看 4. 怎么调程序? 辅助我们调试程序的工具称为IDE 的调试器debugger 北京交通大学计算机与信息技术学院 教师: 林友芳 如何进行入调试? 方法1. 菜单:BuildStart DebugGo 方法2. 直接点击工具条上的Go按钮 方法3. 按热键F5 想让程序停下来,怎么办? 北京交通大学计算机与信息技术学院 教师: 林友芳 设置断点 n断点是 最常用的技巧。 n断点是调试器设置的一个代码位置。当程 序运行到断点时,程序中断执行,回到调 试器。 n调试时,只有设置了断点并使程序回到调 试器,才能对程序进行在线调试。 北京交通大学计算机与信息技术学院 教师: 林友芳 设置断点方法 n可以通过下述方法设置断点 n方法1简单方法 n把光标移动到需要设置断点的代码行上,然后按F9快 捷键,或者点工具条上的小手图标。 n方法2功能更强大的一种方法 n弹出Breakpoints对话框 n按快捷键CTRL+B或ALT+F9,或者通过菜单 Edit/Breakpoints打开。 n打开后点击Break at编辑框的右侧的箭头,选择 合适 的位置信息。一般情况下,直接选择line xxx就足够了 ,如果想设置不是当前位置的断点,可以选择 Advanced,然后填写函数、行号和可执行文件信息。 北京交通大学计算机与信息技术学院 教师: 林友芳 本课件中的采用范例及流程说明 跟踪执行从程序开 始显示菜单执 行第3个功能结 束运行的全过程 课堂演示程序 北京交通大学计算机与信息技术学院 教师: 林友芳 设断点 断点标志 断点标志 主函数里只有 两条语句,调 用菜单函数后 返回。 北京交通大学计算机与信息技术学院 教师: 林友芳 设置断点对话框 北京交通大学计算机与信息技术学院 教师: 林友芳 去掉断点 n把光标移动到给定断点所在的行,再次按 F9就可以取消断点。 n同前面所述,打开Breakpoints对话框后, 也可以按照界面提示去掉断点。 北京交通大学计算机与信息技术学院 教师: 林友芳 条件断点(有点难) n可以为断点设置一个条件,这样的断点称为条件 断点。对于新加的断点,可以单击Conditions( 条件)按钮,为断点设置一个表达式。 n当这个表达式发生改变时,程序就被中断。 北京交通大学计算机与信息技术学院 教师: 林友芳 数据断点(有点难) n数据断点只能在Breakpoints对话框中设置。 n选择“Data”页,就显示了设置数据断点的对话框 n。在编辑框中输入一个表达式,当这个 表达式的 值发生变化时,数据断点就到达。 n一般情况下,这个表达式应该由运算符和全局变 量构成, n例如:在编辑框中输入 SelectTime这个全局变量 的名字,那么当程序中有SelectTime+时,程序 就将停在这个语句处。 北京交通大学计算机与信息技术学院 教师: 林友芳 消息断点(有点难) nVC也支持对Windows消息进行截获。他有 两种方式进行截获:窗口消息处理函数和 特定消息中断。 5. 设了断点以后,如何走程序? 北京交通大学计算机与信息技术学院 教师: 林友芳 进入调试: 1. 点此按钮 2. 按F5 3. BuildStart DebugGo 北京交通大学计算机与信息技术学院 教师: 林友芳 黄色右箭头表示 当前就要执行的 代码行 当前执行中的 上下文(语境 ,函数) 自动给出的当前 语境下的变量值 、返回值观察窗 口 Debug工具栏 自定义的观察窗 口,可以定义多 组 北京交通大学计算机与信息技术学院 教师: 林友芳 掌握Debug工具条的主要按钮含义 Stop debugging 停止调试 step into 单步跟进,如果当前 语句有函数调用,则 单步进入函数执行, 否则单步执行完一条 语句。 step over 单步执行完当前语句 ,若当前语句有函数 调用,除非被调用函 数中有断点,否则不 会跟进函数。 step out 执行完当前语句所在 函数的执行,返回该 函数的调用处。 Run to cursor 执行到当前光标处, 注意观察箭头 便于理解记忆 北京交通大学计算机与信息技术学院 教师: 林友芳 常用进程控制快捷键 快捷键说明 F5go SHIFT+F5Step over CTRL+F5Execute program F7Build CTRL+F7Compile F10Step over CTRL+F10Run to cursor F11Step into SHIFT+F11Step out CRTL+SHIFT+F5Restart 北京交通大学计算机与信息技术学院 教师: 林友芳 点击Step into后 ,进入函数 Menu()执行 当前就要执行 的代码行 语境切换成 Menu() 6. 如何了解执行状态? 北京交通大学计算机与信息技术学院 教师: 林友芳 查看数值 nVC支持查看变量、表达式和内存的值。所 有这些观察都必须是在断点中断的情况下 进行。 n观看变量的值最简单,当断点到达时,把 光标移动到这个变量上,停留一会就可以 看到变量的值。 北京交通大学计算机与信息技术学院 教师: 林友芳 watch nVC提供一种被称为Watch的机制来观看变 量和表达式的值。 n在断点状态下,在变量上单击右键,选择 Quick Watch, 就弹出一个对话框,显示 这个变量的值。 北京交通大学计算机与信息技术学院 教师: 林友芳 watch n单击Debug工具条上的Watch按钮,就出现 一个Watch视图(Watch1, Watch2 , Watch3,Watch4),在该视图中输入变量 或者表达式,就可以观察 变量或者表达式 的值。 n注意:这个表达式不能有副作用,例如+ 运算符绝对禁止用于这个表达式中,因为 这个运算符将修改变量的值,导致 软件的 逻辑被破坏。 北京交通大学计算机与信息技术学院 教师: 林友芳 点击Step over后 ,开始执行当前 函数代码 自动给出当前语 境下变量的值 当前执行的代 码行 北京交通大学计算机与信息技术学院 教师: 林友芳 当前程序运行结果? 什么也没有,为什么? 因为没有输出任何内容 北京交通大学计算机与信息技术学院 教师: 林友芳 再次单击Step over,执行完第 一个printf语句 printf语句返回值 被自动给出,表示 输出了38个字符 执行结果? 北京交通大学计算机与信息技术学院 教师: 林友芳 执行第1条printf语句以后的输出结果 北京交通大学计算机与信息技术学院 教师: 林友芳 点击run to cursor 将光标移动到 此行 printf语句返回值 被自动给出,表 示输出了38个字 符 北京交通大学计算机与信息技术学院 教师: 林友芳 执行到此行之 前 刚才那几个变量怎么不见了 ?因为有点远(上下文), 只显示执行位置附近的,想 看怎么办? 可以在此处增加你想看的东西。 基本方法:直接在此处写上(还有别的 办法加)你想看的内容的表达式 如:想看SeleFun和SelectTime值,想 看SelectTime的地址,怎么办 北京交通大学计算机与信息技术学院 教师: 林友芳 手工增加SeleFun和 SelectTime变量,系 统会自动给出它们的 值 北京交通大学计算机与信息技术学院 教师: 林友芳 继续以step over的方式到此 语句,注意观察debug工具 栏的几个按钮已经变灰,原 因是在执行scanf语句,等待 你在运行窗口中录入数据 手工在任务条点 击显示运行窗口 ,输入3 北京交通大学计算机与信息技术学院 教师: 林友芳 当前上下文的一些 东西又自动出现了 这个+号表示 还可展开查 看 各个变量的值发 生了变化 北京交通大学计算机与信息技术学院 教师: 林友芳 继续单击Step over, 执行到 ExecuteFunction函数 ,然后单击Step into 进入此函数。 北京交通大学计算机与信息技术学院 教师: 林友芳 单击Step into进入 ExecuteFunction函 数执行代码。为什么SeleFun的 值发生了变化? 原因:语境发生变化了, ExecuteFunction函数中没 有这个变量。 北京交通大学计算机与信息技术学院 教师: 林友芳 点击此处继续 执行 当前执行的代 码行 等待用户输入 手工在任务条点 击显示运行窗口 ,输入任意正整 数如:53 北京交通大学计算机与信息技术学院 教师: 林友芳 单击Step into进入 prime函数执行代码 。 北京交通大学计算机与信息技术学院 教师: 林友芳 点击step out,退 出当前函数prime 的执行,返回到原 调用处 北京交通大学计算机与信息技术学院 教师: 林友芳 Call stack调用堆栈 n想要知道函数被调用的过程怎么办? n调用堆栈 n反映了当前断点处函数是被那些函数按照什么顺序调 用的。 n单击Call stack按钮,显示Call Stack对话框。其中显示 了一个调用系列,最上面的是当前函数,往下依次是 调用函数的上级函数。 n单击这些函数名可以跳到对应的函数中去。 此按钮 北京交通大学计算机与信息技术学院 教师: 林友芳 点击step out,退 出当前函数prime 的执行,返回到原 调用处 原调用处 运行结果显 示 北京交通大学计算机与信息技术学院 教师: 林友芳 再次点击step out ,退出当前函数 ExecuteFunction的 执行,返回到原调 用处 此时准备执行 下一遍循环 注意语 境变化 观察SeleFun值的改变 ,因为语境发生变化 ,返回到了主调函数 Menu()。 观察SelectTime值的变 化,因为选择了一次 执行 北京交通大学计算机与信息技术学院 教师: 林友芳 执行该行语句 ,等待用户输 入选项 北京交通大学计算机与信息技术学院 教师: 林友芳 输入选项为0, 准备结束程序 运行 北京交通大学计算机与信息技术学院 教师: 林友芳 执行该语句, 跳出for循环 打印选择次数 北京交通大学计算机与信息技术学院 教师: 林友芳 Menu()执行完毕, 执行return语句后结 束整个程序的调试运 行。 在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论