查找和排除程序运行中发现的错误(debugging)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
查找和排除程序运行中发现的错误(debugging)(在建设和不断修改中,欢迎提出意见)
学生:我的程序编译连接都通过了,为什么运行中系统还会报出错误?
老师:这一般说明你的程序在某些方面做了违反C语言规定(违规)的事情,而这种情况是在运行的动态过程中出现的。
你现在用的系统能够检查出这个问题,所以就报了错
误。
学生:我的程序编译运行都正常,怎么就是结果不对?(怎么就不能完成我想做的事情?)
老师:出现这种问题的可能原因很多,解决起来也比较困难些。
你最好首先认真读一读你的程序,想一想它可能存在什么问题,然后再…………
从外面看,运行时发现的错误可以分为两类:一类是系统能够检查并产生
信息的错误;另一类是系统不检查也不产生运行错误信息的错误。
不同的系统
在检查哪些问题方面可能差别很大。
抽象地看,运行时发现的程序错误可以分为两类:一类是程序中某些地方
执行了违反语言规定的操作,由此产生某种影响导致程序出错;另一类问题出
在程序本身,例如程序的算法不对,或者是程序写的不对(没有表达你所想说
的东西),这些一般称为逻辑错误。
这种问题分类只有提示性,并不是绝对
的,有时也很难划分清楚。
违规型的错误
最常见的违规错误是非法地址访问。
有些系统(例如DOS)对这类错误完
全不检查,可能造成很严重的后果,常常会破坏系统,造成死机或者非常奇怪
的系统行为。
有些系统(例如 Windows NT)管理比较严格,可能确认程序非法
访问而将其kill掉。
1)对空指针、未初始化的指针的间接访问。
这涉及到对指针值所确定地址
的访问,常常是非法的。
2)把整数或者其他变量当作指针使用,造成访问非法地址的情况,例如,
假定 n 和 x 分别是整的和双精度的变量;下面语句将它们的值当作指针值使
用,形成非法访问:
scanf("%d %lf", n, x);
3)数组的越界访问。
效果无法预料,有时可能被系统检查出来,有时可能
检查不出来,造成奇怪的程序行为。
逻辑型的错误(语义错误)
一类常见错误是计算溢出、除零等。
C语言对于无符号数的上溢出(超出
表示范围)自动丢掉最高位,对于一般整数类型、浮点数类型,语言的标准本
身并没有明确规定,不同C语言系统的处理方式可能不同。
大部分C语言系统
忽略整数溢出的情况。
无论如何,出现溢出往往会造成结果与预想的东西不
符。
排除程序错误的基本方法
排错系统(debugger)的使用,原理、技术、方法。
局限性。
参考材料:《程序设计实践》第5章:排错。