1 前言
当程序的运行结果与程序员预想的不一样,如死机,计算值不正确,出现内存访问冲突等,就需要进行调试
2 进行调试前的准备工作
因为程序调试是一项十分耗时的工作,很难估计出将要花费多长时间,因此在调试前,一定要做好充分准备,尽量避免做无用功:
1. 构造好的测试步骤,让程序出错有规律性或出错的概率越大越好
2. 被调试程序及相关库是最符合要求的版本
3. 工程临时文件如.ncb被删除
4. 整个工程被重新编译
5. 应用程序的链接路经与调试路径保持一致
6. 单体测试全部通过
3 出错位置和原因的确定
3.1 几种典型错误的原因
1 内存莫名其妙的失效
原因:内存指针被多处引用,被多处释放
2 多线程条件下死机
原因:线程中由于用了SendMessage而造成死锁,可人为加入消息循环
3 多线程条件下内存访问冲突
原因:内存被多个线程同时使用,可加入线程同步机制(用消息队列,信号灯等)
4 内存访问冲突
原因:内存越界(如字符串拷贝,内存拷贝)
5 窗口消息的次序问题
原因:如窗口未初始化就开始用
3.2 定位错误的位置
1 对代码的理解越深,对代码出错位置的确定越精确,必要时应画出相关代码的类图和时序图
2 从IDE调用堆栈判断出错位置和原因
3 从Win32 API或MFC类库函数的返回错误码判断出错原因,返回错误码的含义可以从MSDN或源代码中找到,还可以通过VC工具Error lookup找到
4 在代码中加入带编号的TRACE语句或MessageBox(release版),逐步缩小调试范围
5 对于死机现象或偶发现象,可通过逐步注释掉代码的方法确定死机的位置和原因
6 如果死机现象或偶发现象是新出现的,可以通过比较目前版本和上一版本的差异来确定位置和原因
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)