文档介绍:outline
错误类型
排错技巧 整体上减少错误的方法
便于调试的代码风格
排错
VC调试技巧
银平 建议
错误类型整体上减少错误的方法
编译错误 减少程序各个部分之间的关联
逻辑错误 Z程序的复杂性与各部件间可能互相作用的途
Z程序运行结果不对径数目有关
异常错误 Z方法:信息隐蔽、抽象和界面(很多语言有
这方面的支持)
Z指针异常
Z内存分配异常 使用错误较少的语言
Z除0异常 Z比如,取消指针,取消goto
Z…… Z没有任何语言能够防止你犯错误!!
便于调试的代码风格排错
排错心理准备
尽量不用全局变量 易重现错误
所有变量都要初始化,成员变量在构造函数 不可重现错误
中初始化
尽量使用const
详尽的注释
1
排错(1):心理准备排错(2):错误定位
不要把所有的判断交给编译器和调试器,应该在程
排错的时间至少跟写程序一样长序中自己加以程序保护和错误定位
发现错误能够防止类似的错误再发生 Z参数检查,返回值检查
使用异常机制
因此最好自己发现错误,这样记忆比较牢固 Z
Z Z使用调试输出
Z多做笔记#define PR(x) cout<<#x”=”<<x<<'\n‘
Z日志输出
不要去怀疑编译器和库函数 Log4cplus
/forum/?forum_id=351392
Z虽然编译器和库函数可能有bug,但是出现 log4j
bug的可能性极其极其小
排错(3):易重现错误排错(4):不可重现错误(1)
简单的排错步骤 检查日志和调试输出,确定大概出错位置
Z使用排错系统取得堆栈轨迹和几个变量的值 检查变量是否都初始化
Z发现出错的位置 很可能是存储分配错误
Z比如char* msg(){char c[10];...,return c;}
Z多数是一些低级错误(如i,j搞混了)
Z比如for(p=listp;p!=NULL;p=p->next)free(p);
Z记录一些常犯错误,对照检查 Z比如int c[10],a=0; c[--a]=1;
Z读程序,而不是马上去改程序 当程序出现不可理解的异常时,多半是某个地方有
内存越界
Z前面赋值 a=5,后面却发现a的值不为5
不可重现错误(2) VC调试技巧
使用函数时注意 编译选项
Z不要使用还没有完全了解输入要求和输出结 Z高警