●●● ●●●●● 有线索,简单错误 ●●●● ●●● ●●●● ●●0● ●大部分编译和链接错误 重视 warning ●检查最近的改动 ●取得堆栈轨迹和变量值,确定出错位置
有线索,简单错误 ⚫ 大部分编译和链接错误 ⚫ 重视warning ⚫ 检查最近的改动 ⚫ 取得堆栈轨迹和变量值,确定出错位置
●●● ●●● ●●●●● ●●●● 简单代码容易出错 ●●● ●●●● ●●0● o if(flag=1) if(x&y) char str[10]; strl1=a if(); str[2]=b';str[3]=c; cout<<str<<end: int k: int a20]: for (int i=o; 1<20; cout<<alk i++) ali]=ali+1]; for (i=0; 1<10; 1++) for〔=06<10;i++)
简单代码容易出错 ⚫ if(flag=1) ⚫ if(x&y) ⚫ if(…); ⚫ int k; …; cout<<a[k]; for (i=0; i<10; i++) for (j=0;j<10;i++) ▫ char str[10]; str[1]=‘a’; str[2]=‘b’ ;str[3]=‘c’; cout<<str<<endl; ▫ int a[20]; for (int i=0; i<20; i++) a[i] = a[i+1];
改正简单错误 ●●●●● ●●●● ●●● ●●●● ●●0● ●读程序而不是马上改程序 ●休息一下,有时你看到的代码实际是自己的 意愿,不是实际写出来的东西 ●改正一个错误后不要急着编译运行,看看是 否在别处也有类似错误
改正简单错误 ⚫ 读程序,而不是马上改程序 ⚫ 休息一下,有时你看到的代码实际是自己的 意愿,不是实际写出来的东西 ⚫ 改正一个错误后,不要急着编译运行,看看是 否在别处也有类似错误
●●●●● 无线索、难办的错误 ●●●● ●●● ●●●● ●●0● ●把错误弄成可以重现的 对代码分而治之 ●加入打印语句,使搜索局部化 写自检测代码,错误排除后注释掉它或用排错 选项控制它 ●研究错误的统计特征 ●检查宏定义的函数
无线索、难办的错误 ⚫ 把错误弄成可以重现的 ⚫ 对代码分而治之 ⚫ 加入打印语句,使搜索局部化 ⚫ 写自检测代码,错误排除后注释掉它或用排错 选项控制它 ⚫ 研究错误的统计特征 ⚫ 检查宏定义的函数
●●●●● ●●●● 不可重现的错误 ●●●●● ●●●● ●●0● ●检查日志和调试输出,确定大概出错位置,对 多线程以及长时间运行的服务器程序尤其有用 ●检查变量初始化 ●当程序出现不可理解的异常时,多半是某个地 方有内存越界,或存储分配错误 养成习惯: ●动态分配内存后,检查是否分配成功 ●释放内存后把指针指向NULL,释放前检査查指针是否 为NULL .http://ww.yolinux.com/tutorials/c++memoryCorruptionandMemoryLEaks.ht
不可重现的错误 ⚫ 检查日志和调试输出,确定大概出错位置,对 多线程以及长时间运行的服务器程序尤其有用 ⚫ 检查变量初始化 ⚫ 当程序出现不可理解的异常时,多半是某个地 方有内存越界,或存储分配错误 ⚫ 养成习惯: ⚫ 动态分配内存后,检查是否分配成功 ⚫ 释放内存后把指针指向NULL,释放前检查指针是否 为NULL ⚫ http://www.yolinux.com/TUTORIALS/C++MemoryCorruptionAndMemoryLeaks.ht ml