资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
程序调试与程序排错,课程主要内容,程序调试方法 程序排错方法 程序排错举例 问题与习题,第一部分 程序排错方法,主要内容,1.1 程序调试技巧_VC 1.2 排错准备 1.3 排查过程实例,1.1 程序调试技巧_VC(1),设置断点(F9) 在当前光标所在的行下断点,如果当前行已经有断点,则取消断点; F5调试状态运行程序,程序执行到有断点的地方会停下来; 通过ALT+F9还可以下设置条件断点; 注意,并不是所有断点都会停;比如被设置断点的语句在程序里面没有被执行; 单步执行(F10) 单步执行程序; CTRL+F10运行到光标所在行; 单步执行深入函数内部(F11) 如果当前执行语句是函数调用,则会进入函数里面; SHIFT+F11跳出当前所在函数; 通过Memory了解指定内存地址内存储的内容 通过CallStack了解上级(父)函数内部信息,包括变量数值,1.1 程序调试技巧_VC(2),通过打印信息排错 如果VC提供的调试手段还不能符合需要,可以尝试打印信息的方式;在需要输出信息的地方写上printf(“?”); 打印可以根据需要输出信息; 打印信息可以长期保存,便于他人参与分析和讨论;,1.2 排查准备(1),排查的立足点 发现问题,首先要怀疑是自己的问题,而不是抱怨编译系统、或者程序库、或者除了他们的代码之外的其他任何东西; 排错必须从结果出发,逆向思考,去发现原因。一旦有了一个完全的解释,我们就知道如何去更正了; 看看程序垮台前已经有了什么样的输出 如果可能的话,看看堆栈轨迹(callstack) 排查思路 如果有明显的线索 寻找熟悉的模式 检查最近的改动。错误很可能就在新的代码里,或者是由于这些改动而暴露出来 不要两次犯同样的错误。当你改正了一个错误后,应该问问自己是否在程序里其他地方也犯过同样错误 现在排除,而不是以后。在急忙中需要处理的事情太多,也可能造成其他损害。在任何一次程序垮台时都不要忽视它,应该立即对它进行跟踪,因为它可能不会再现,直到一切都变得太晚了,1.2 排查准备(2),现在排除,而不是以后。在急忙中需要处理的事情太多,也可能造成其他损害。在任何一次程序垮台时都不要忽视它,应该立即对它进行跟踪,因为它可能不会再现,直到一切都变得太晚了 取得堆栈轨迹(callstack) 非常仔细地阅读代码,仔细想一段时间,但是不要急于去做修改 把你的代码解释给别人,让有经验的人分析 如果有明显的线索 把错误弄成可以重现的 第一步应该是设法保证你能够使错误按自己的要求重现 如果无法把错误弄成每次都出现的,那么就应该设法弄清为什么做不到。即使你无法保证错误每次都出现,如果你能减少等待它出现的时间,也就能够更快地找到它。 如果一个程序提供了排错输出,那么就应该打开它 分而治之 设法构造出最小的又能保证错误现身的输入,这样可以减少可能性 采用二分检索的方式,1.2 排查准备(3),研究错误的计数特性 显示输出,使搜索局部化 写自检测代码 如果需要更多的信息,你可以写自己的检查函数去测试某些条件、打印出相关变量的值或者终止程序 写出一些例行程序,让它们对数据结构或其他信息做在线的一致性检查 写记录文件。以某种固定格式写出一系列的排错输出 画一个图。在测试和排错中,有时图形比文字更加有效 保留记录。如果查找某个错误的过程花了一定时间,你可能就要开始忘记试验过的情况和已经学到的东西了。,1.3 排查过程实例(1),利用VC的Debug工具进行调试 关于A程序的功能详细说明见word文档。 关于A程序代码请参见a.c文件。 阅读运行方法:选中文件“a.c”图标,,右键Copy粘贴到指定的文件夹打开。 需要排查的问题 问题1:程序里面存在一个错误,导致程序运行不能结束,请排除; 问题2:排除问题1后,程序输出结果如下: 11 34 33 32 12 30 29 28 27 26 25 24 35 22 21 20 19 18 17 16 13 14 23 31 13 结果仍不正确,请继续排查;,1.3 排查过程实例(2),分析步骤 程序现状 如下图,程序陷于死循环状态。,1.3 排查过程实例(3),出发点 看代码 可能会找到原因,但是非常耗时;对于这个问题,不是很适用。 利用VC的Debug工具 VC提供了很多Debug的工具,如设置断点(F9)、单步执行(F10)详细参见IA_VC+&MSDN的使用 对于死循环的程序,可以通过菜单中DebugBreak(方式如图),来暂停程序。,1.3 排查过程实例(4),暂停后的程序如图。,1.3 排查过程实例(5),问题的原因 通过F10单步执行,你会发现程序这个循环(上图)中出不来了。 原因是变量j在循环体内被误修改(如下),导致死循环。 if (j = min1) | (j = min2) ) . 这就是导致问题的原因,判断符号被误写成赋值符号,多么惨痛的教训! 继续 将if (j = min1) | (j = min2) ) 修改if (j = min1) | (j = min2) ) 后,继续执行程序,可以得到如下的输出: 11 34 33 32 12 30 29 28 27 26 25 24 35 22 21 20 19 18 17 16 13 14 23 31 13 这个结果仍不正确,需要继续调查。 请各位利用VC的Debug工具解决这个问题。,第二部分 问题与习题,问题表,Q1:如何设置断点、取消断点? Q2:如何设置条件断点? Q3:CallStack的功能是什么? Q4:Memory的功能是什么? Q5:如何程序陷于死循环,如何定位到是那个循环?,练习题,8.习题 详细见习题集,谢谢!,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号