bug: “臭虫” 第一次被发现的导致计算机错误的飞蛾,从此成为计算机程序错误的的代号。
调试:(debug)又叫除错,发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
调试的基本步骤:
(1)发现程序错误的存在
(2)以隔离,消除等方式定位错误
(3)确定错误产生的原因
(4)提出纠正错误的解决办法
(5)纠正错误,重新测试
Debug和Release的区别
(1)debug 通常称为 调试版本,它包含调试信息,不作任何优化,便于程序员调试程序。
(2)release 通常称为 发布版本,它进行了各种的优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。
(3)调试就是在debug版本的环境中,找代码中潜伏问题的过程。
linux开发环境调试工具是gdb,后期会介绍。
windows环境调试介绍
(1)在环境中选择 debug 选项,才能正常调试。
(2)快捷键 :
f5 启动调试,经常用来直接调到下一个断点。
f9 创建和取消断点,可以在程序中任意位置设置断点,这样就可以使得程序在想要的地方随意停止执行。f9和f5搭配使用。
f10 逐过程,遇到函数不进函数里面。
f11 逐语句,遇到函数进到函数里面。
Ctrl键加f5 开始执行不调试。
(3)调试时查看程序当前信息
查看临时变量的值 (f10>调试>窗口>监视)
查看内存信息 (f10>调试>窗口>内存)
查看调用堆栈(f10>调试>窗口>调用堆栈)
调用堆栈,可以清晰反映函数调用关系以及当前调用所处的位置。
查看汇编消息{1 右击鼠标,选择转到反汇编}
{2 f10>调试>窗口>反汇编}
查看寄存器信息(f10>调试>窗口>寄存器)
(4)只有多动手,尝试调试,才能有进步。
优秀代码:
(1)代码运行正常
(2)bug很少
(3)效率高
(4)可读性高
(5)可维护性高
(6)注释清晰
(7)文档齐全
常见的写代码技巧:
(1)使用assert 断言
(2)使用const 定义常变量
(3)养成良好的编码风格
(4)添加必要的注释
(5)避免编码的陷阱
举个例子: 模拟实现库函数strcpy(复制)
char * strcpy(char* dst, const char* src)
{
char * cp = dst;
assert (dst != NULL );
assert (src != NULL );
while (*cp++ = *src++)//先取内容复制,在把地址加一个,再取内容复制,依次循环
{
;
}
return dst;
}
模拟实现一个strlen函数
# include <stdio.h>
char* my_strlen( const char* str)
{
int count = 0;
assert (str != NULL);
while (*str)//判断字符串是否结束
{
count++;
str++;
}
return count;
}
int main()
{
const char* p = "abcdef"; //*p不能改变(也就是p的内容不可改变)
printf ("%d\n", my_strlen(p) );
return 0;
}