《C语言课程序调试》PPT课件.ppt

上传人:san****019 文档编号:7343850 上传时间:2020-03-20 格式:PPT 页数:66 大小:2.55MB
返回 下载 相关 举报
《C语言课程序调试》PPT课件.ppt_第1页
第1页 / 共66页
《C语言课程序调试》PPT课件.ppt_第2页
第2页 / 共66页
《C语言课程序调试》PPT课件.ppt_第3页
第3页 / 共66页
点击查看更多>>
资源描述
第8部分 2程序调试 1 概述 什么叫调试 程序没有语法错误 但运行结果不符合期望时 采用适当的工具或方法 反复找出程序中存在的问题 进行修改 最终使程序符合要求的过程 调试是一个程序员必须要掌握的基本技巧 对于编写高质量程序非常重要 掌握基本的调试技巧对今后的学习 工作是非常必要的 为什么要调试 问题我的程序跟书上一样 怎么就不出结果呢 我的程序没错啊 怎么不出结果啊 我的程序运行结果不正确 如何找到错误 原因程序没有语法错误 不等于就没有语义错误 要确保程序没错 必须对程序进行各种测试 2 解决程序中的错误的方法 基本方法 人工阅读走查 修改 程序员一行一行的看程序根据实验数据 在脑子里或在纸上模拟程序运行过程 在脑子里或纸上记录程序中间运行结果 在这过程中发现程序的错误 修改发现错误 重新运行测试 如果还有错 继续查看 修改 这种方法是最为基本 人人都必须掌握的方法 以前程序调试手段以少 人们经常只能用用纸 笔和脑来模拟和记录程序动态运行中的状态 基本方法存在的问题 这种方法效率不高 属于原始的方法 要求程序员具有很强的源程序理解 运行过程记忆 预测 纠错能力和经验 程序员必须用脑子 纸 笔来模拟程序的运行状态记录程序的执行进度记录所有变量或数据变化过程观察和记住执行过程中环境的变化程序和模块达到一定规模以后 就很难这样方法调试 效率太低 难度太大 很难发现问题 很难记录状态变化过程 程序员脑子中的计算与程序实际完成的计算往往有差异 这样的差异是很难发现的 是很难在纸上体现出来的 采用辅助工具来协助调试 随着技术的进步 各种IDE的功能越来越强大 人们在IDE中实现并提供许多功能用来辅助程序员对程序进行调试 IDE的辅助功能提供工具让程序员能控制并看到程序的执行进程 如单步执行 执行到某个位置 进入到某个函数内部执行 在执行过程中 提供工具记录 展示甚至修改环境的状态 变量值 内存数据 函数返回值 程序界面输出结果 使程序员不需要再在脑子中执行程序 使程序员不需要完全只用脑或纸和笔来记录程序的运行状态 并保证中间结果的正确性 一些值得思考的问题 为什么集成开发环境能够让程序员调试程序 是如何做到的 IDE要能使程序员调试一个程序 需要保存关于程序的哪些信息 调试信息 3 项目配置与调试ProjectConfigurationanddebugging 你是否注意到每个项目中的debug文件夹 注意 本节有许多很理解的概念 如果暂时看不懂 可以先跳过去 什么叫项目 项目即project 指通过设计实现一组程序完成用户所需功能的工程及过程 请查看 上机写程序 那个课件关于项目的解释 两个概念Projectsettings 项目设置Projectconfiguration 项目配置 Projectsettings 项目具有许多属性 如 编译结果输出目录工作目录编译参数需要链接的函数库编译完以后做什么操作编译前要做的操作 了解这些属性的意义以后 我们可以对这些属性值进行设置 以影响编译器的编译行为 ProjectConfiguration 对项目的所有属性的一组设置值统称为一个ProjectConfiguration 即一组ProjectSettings统称为一个ProjectConfiguration VC提供两组标准项目设置信息的Configuration模板Debug 默认的活跃的项目配置模板Release很有经验的程序员也可新建不同于这两组标准模板的项目配置 Setactiveprojectconfiguration 在同一时刻 只能有一个configuration是有效的或活跃的 在Build菜单下选择Setactiveprojectconfiguration 对项目配置的理解 可以从这个角度来简化理解 不够准确 每一个project都有一个开发状态 称为debug与release 得到的编译结果分别称为Debug版程序 还处于调试状态的程序Release版程序 最终提交给用户的可以执行的程序问题Debug版与Release版有什么区别 区别 标准的Debug版的项目配置指示编译器在编译时 使项目或程序中包含有调试信息 对程序不做任何的优化 便于程序员调试程序 标准的Release版的配置指示编译器在编译时对程序进行优化 得到的结果在代码大小和运行速度上都是较优的 程序中也不包含调试信息 问题 什么叫优化 为什么不能优化 ProjectSettings 选择C C 页 Category中选择general 则出现一个DebugInfo 调试信息 下拉列表框 可供选择的调试信息方式包括 一些编译选项及解释 看不懂可先不看 4 怎么调程序 辅助我们调试程序的工具称为IDE的调试器debugger 如何进行入调试 方法1 菜单 Build StartDebug Go方法2 直接点击工具条上的Go按钮方法3 按热键F5 想让程序停下来 怎么办 设置断点 断点是最常用的技巧 断点是调试器设置的一个代码位置 当程序运行到断点时 程序中断执行 回到调试器 调试时 只有设置了断点并使程序回到调试器 才能对程序进行在线调试 设置断点方法 可以通过下述方法设置断点方法1 简单方法把光标移动到需要设置断点的代码行上 然后按F9快捷键 或者点工具条上的小手图标 方法2 功能更强大的一种方法弹出Breakpoints对话框按快捷键CTRL B或ALT F9 或者通过菜单Edit Breakpoints打开 打开后点击Breakat编辑框的右侧的箭头 选择合适的位置信息 一般情况下 直接选择linexxx就足够了 如果想设置不是当前位置的断点 可以选择Advanced 然后填写函数 行号和可执行文件信息 本课件中的采用范例及流程说明 跟踪执行从程序开始 显示菜单 执行第3个功能 结束运行的全过程 课堂演示程序 设断点 断点标志 断点标志 主函数里只有两条语句 调用菜单函数后返回 设置断点对话框 去掉断点 把光标移动到给定断点所在的行 再次按F9就可以取消断点 同前面所述 打开Breakpoints对话框后 也可以按照界面提示去掉断点 条件断点 有点难 可以为断点设置一个条件 这样的断点称为条件断点 对于新加的断点 可以单击Conditions 条件 按钮 为断点设置一个表达式 当这个表达式发生改变时 程序就被中断 数据断点 有点难 数据断点只能在Breakpoints对话框中设置 选择 Data 页 就显示了设置数据断点的对话框 在编辑框中输入一个表达式 当这个表达式的值发生变化时 数据断点就到达 一般情况下 这个表达式应该由运算符和全局变量构成 例如 在编辑框中输入SelectTime这个全局变量的名字 那么当程序中有SelectTime 时 程序就将停在这个语句处 消息断点 有点难 VC也支持对Windows消息进行截获 他有两种方式进行截获 窗口消息处理函数和特定消息中断 5 设了断点以后 如何走程序 进入调试 1 点此按钮2 按F53 Build StartDebug Go 黄色右箭头表示当前就要执行的代码行 当前执行中的上下文 语境 函数 自动给出的当前语境下的变量值 返回值观察窗口 Debug工具栏 自定义的观察窗口 可以定义多组 掌握Debug工具条的主要按钮含义 Stopdebugging停止调试 stepinto单步跟进 如果当前语句有函数调用 则单步进入函数执行 否则单步执行完一条语句 stepover单步执行完当前语句 若当前语句有函数调用 除非被调用函数中有断点 否则不会跟进函数 stepout执行完当前语句所在函数的执行 返回该函数的调用处 Runtocursor执行到当前光标处 注意观察箭头便于理解记忆 常用进程控制快捷键 点击Stepinto后 进入函数Menu 执行 当前就要执行的代码行 语境切换成Menu 6 如何了解执行状态 查看数值 VC支持查看变量 表达式和内存的值 所有这些观察都必须是在断点中断的情况下进行 观看变量的值最简单 当断点到达时 把光标移动到这个变量上 停留一会就可以看到变量的值 watch VC提供一种被称为Watch的机制来观看变量和表达式的值 在断点状态下 在变量上单击右键 选择QuickWatch 就弹出一个对话框 显示这个变量的值 watch 单击Debug工具条上的Watch按钮 就出现一个Watch视图 Watch1 Watch2 Watch3 Watch4 在该视图中输入变量或者表达式 就可以观察变量或者表达式的值 注意 这个表达式不能有副作用 例如 运算符绝对禁止用于这个表达式中 因为这个运算符将修改变量的值 导致软件的逻辑被破坏 点击Stepover后 开始执行当前函数代码 自动给出当前语境下变量的值 当前执行的代码行 当前程序运行结果 什么也没有 为什么 因为没有输出任何内容 再次单击Stepover 执行完第一个printf语句 printf语句返回值被自动给出 表示输出了38个字符 执行结果 执行第1条printf语句以后的输出结果 点击runtocursor 将光标移动到此行 printf语句返回值被自动给出 表示输出了38个字符 执行到此行之前 刚才那几个变量怎么不见了 因为有点远 上下文 只显示执行位置附近的 想看怎么办 可以在此处增加你想看的东西 基本方法 直接在此处写上 还有别的办法加 你想看的内容的表达式如 想看SeleFun和SelectTime值 想看SelectTime的地址 怎么办 手工增加SeleFun和SelectTime变量 系统会自动给出它们的值 继续以stepover的方式到此语句 注意观察debug工具栏的几个按钮已经变灰 原因是在执行scanf语句 等待你在运行窗口中录入数据 手工在任务条点击显示运行窗口 输入3 当前上下文的一些东西又自动出现了 这个 号表示还可展开查看 各个变量的值发生了变化 继续单击Stepover 执行到ExecuteFunction函数 然后单击Stepinto进入此函数 单击Stepinto进入ExecuteFunction函数执行代码 为什么SeleFun的值发生了变化 原因 语境发生变化了 ExecuteFunction函数中没有这个变量 点击此处继续执行 当前执行的代码行 等待用户输入 手工在任务条点击显示运行窗口 输入任意正整数如 53 单击Stepinto进入prime函数执行代码 点击stepout 退出当前函数prime的执行 返回到原调用处 Callstack 调用堆栈 想要知道函数被调用的过程怎么办 调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的 单击Callstack按钮 显示CallStack对话框 其中显示了一个调用系列 最上面的是当前函数 往下依次是调用函数的上级函数 单击这些函数名可以跳到对应的函数中去 此按钮 点击stepout 退出当前函数prime的执行 返回到原调用处 原调用处 运行结果显示 再次点击stepout 退出当前函数ExecuteFunction的执行 返回到原调用处 此时准备执行下一遍循环 注意语境变化 观察SeleFun值的改变 因为语境发生变化 返回到了主调函数Menu 观察SelectTime值的变化 因为选择了一次执行 执行该行语句 等待用户输入选项 输入选项为0 准备结束程序运行 执行该语句 跳出for循环 打印选择次数 Menu 执行完毕 执行return语句后结束整个程序的调试运行 在调试过程中可以随时点击此按钮结束程序运行 8 Debug工具条上的其它按钮功能 Memory 由于指针指向的数组 Watch只能显示第一个元素的值 为了显示数组的后续内容 或者要显示一片内存的内容 可以使用memory功能 在Debug工具条上点memory按钮 就弹出一个对话框 在其中输入地址 就可以显示该地址指向的内存的内容 Varibles Debug工具条上的Varibles按钮弹出一个框 显示所有当前执行上下文中可见的变量的值 特别是当前指令涉及的变量 以红色显示 Reigsters Debug工具条上的Reigsters按钮弹出一个框 显示当前的所有寄存器的值 其他调试手段 系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息 如下 本章应掌握的内容 掌握开发环境 工作空间 项目 程序模块的基本概念 学会使用基本的调试工具 本部分结束
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!