实用调试技巧
1.什么是bug
2.调试是什么?,有多么重要?
3.debug和release的介绍。
4.windows环境调试介绍。
5.一些调试的实例。
6.如何写出好/易于调试的代码?
7.编程常见的错误。
什么是bug
bug(臭虫)
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误
调试是什么?有多重要?
所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩埋也就没有迹象了,如果问心有愧,就比须需要掩埋,那就一定会有迹象,迹象越多越容易顺藤而上,这就是推理的途径,顺着这条途径顺流而下,就是犯罪,逆流而上就,就是真相。
一名优秀的程序员是一名优秀的侦探
每一次调试都是一次尝试破案的过程
调试是什么?
调试(Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
调试的基本步骤:
1.发现程序错误的存在
2.以隔离,消除等方式对错误进行定位
3.确定错误产生的原因
4.提出纠正错误的解决方法
5.对程序错误予以改正,重新测试
Debug和realease的介绍
Debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试。
Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好使用。
test.c 可执行程序
Debug Debug版本的可执行程序-----------------包含调试的信息:如监视等;
Release Release版本的可执行程序---------------是给软件测试测试的版本;
VS环境下的快捷键,最常使用的几个快捷键:
F5:启动调试,经常用来直接调到下一个断点处。
F9:创建断点和取消断点,断点的重要作用:可以在程序的任意位置设置断点,这样就可以使得程序在想要的位置,随意停止执行,继而一步步执行下去。
F10: 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,也可以是一条语句,
F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的);
CRTL+F5:开始执行不调试,如果你想让程序直接运行起来而不用调试就可以直接使用;
多多动手,尝试调试,才能有进步。
1.一定要 熟练掌握调试技巧
2.初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,80%的时间都在调试。
3.我们所讲的都是一些简单的调试。以后可能会出现很多复杂调试场景;多线程程序的调试等。
4.多多使用快捷键,提高效率;
如何写出一个好(易于调试)的代码
优秀的代码:
1.代码运行正常
2.bug很少
3.效率高
4.可读性高
5.可维护性高
6.注释清晰
7.文档齐全
常见的coding技巧
1.使用assert
2.尽量使用const
3.养成良好的编码分格
4.添加必要的注释
5.避免编码的陷阱
举个例子:
//void my_strcpy(char* dest, char* src)
//{
// while (*src != '\0')
// {
// *dest = *src;
// dest++;
// src++;
// }
// *dest = *src;//这里把'\0'拷贝过来;
//}
void my_strcpy(char* dest, const char* src)//这里使用const的原因是万一把src与dest的位置写反了,而src不可修改,就会报错出来;
{
assert(dest != NULL);
assert(src != NULL);//这里使用断言指令当它不满足这个条件时什么都不会发生,满足后就会报错;
while (*dest++ = *src++)//这里先调换然后再加加当=\0时那么就为假跳出循环
{
;
}
}
int main()
{
char arr1[] = "####################";
char arr2[] = "bit";
//strcpy(arr1, arr2);//这里会把/0也打印过来所以只会打印bit;我们自己写一个函数;
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
对const在指针里使用技巧:
int main()
{
int num = 10;
const int* p = #//int *const p = #
//const放在指针变量的*左边时,修饰的是*p,也就是说:不能通过p来改变*p(num)的值;
//const放在指针变量的右边时,修饰的时指针变量p本身,p不能被改变了;
return 0;
}
再举个例子:用刚刚更安全的方法实现stlen函数的实现
int my_strlen(const char* arr)
{
int count = 0;
assert(arr != NULL);
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[] = "abcde";
int len = my_strlen(arr);
printf("%d", len);
return 0;
}
编程常见的错误:
常见的错误分类:
1.编译型错误:
直接查看错误提示信息(双击),解决问题。或凭借经验就可以搞定。相对来说简单。
2.链接型错误:
看错误提示信息,主要再代码中找到错误信息中的标识符,然后定位问题所在,一般是标识符名不存在或者拼写错误。
3.运行时错误:
借助调试,逐步定位问题,最难搞。