目录
6.例子1:自己写一个strcpy函数(感受什么是好的代码)
所谓调试就是改bug,改错误。
1.什么是bug(软件缺陷)?
- 产品说明书中规定要做的事情,而软件没有实现。
- 产品说明书中规定不要做的事情,而软件确实现了。
- 产品说明书中没有提到过的事情,而软件确实现了。
- 产品说明书中没有提到但是必须要做的事情,软件确没有实现。
- 软件很难理解,很难使用,速度超慢,测试人员站在最终用户的角度看到的问题是平常的但不是正确的。
2.调试
2.1 调试是什么?
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
2.2 调试的基本步骤
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
2.3 Debug和Release的介绍。
- Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
- Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
因为release进行优化后,所以所占内存比debug少。
并且程序员在调试代码时在debug版本上进行调试,而release版本不可以进行调试。
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
在上述代码中在vs2022中debug版呈现死循环。我们不知道死循环的原因就可以通过调试来判断。
在进行了12次循环,发现arr[12]和i同时变为了0;这时想为什们,是不是地址相同,改arr[12]的时候把i也改掉了。在进行判断,结果发现地址相同。
其原因是i,arr,都是局部变量都存放在栈区中,而栈区在内存中存放是先进后出,先用高地址再用低地址,而数组随着下标的增大地址由低到高增大。而在vs编译器中在局部变量正好差2个整型。因此&arr[12]=&i;改变了arr[12]就改变了i=0;就死循环了。
但是如果在release版中他会自动进行优化,打印12次后就会停下来。
3.环境调试
3.1调试环境的准备
在环境中选择 debug选项,才能使代码正常调试.
3.2 学会快捷键
最常使用的几个快捷键:
- F5 启动调试,经常用来直接跳到下一个断点处。
- F9 创建断点和取消断点
断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
- F10 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
- F11 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
- CTRL + F5 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。
3.3 调试的时候查看程序当前信息
只有在开始调试的时候才可以查看信息打开监视内存等一系列东西。 可以自己多尝试几遍就熟悉了。
4.多多动手,尝试调试,才能有进步。
一定要熟练掌握调试技巧。
初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写
程序,但是80%的时间在调试。
我们所讲的都是一些简单的调试。
以后可能会出现很复杂调试场景:多线程程序的调试等。
多多使用快捷键,提升效率。
5.如何写出好(易于调试)的代码。
5.1 优秀的代码:
优秀代码的标志
1. 代码运行正常
2. bug很少
3. 效率高
4. 可读性高
5. 可维护性高
6. 注释清晰
7. 文档齐全
常见的coding技巧:
1. 使用assert
2. 尽量使用const
3. 养成良好的编码风格
4. 添加必要的注释
5. 避免编码的陷阱。
6.例子1:自己写一个strcpy函数(感受什么是好的代码)
想要自己学习可以在cplusplus.com网站查找相关信息下列信息来源与该网站
strcpy功能: 拷贝字符串(下面是功能描述)
通过了解strcpy的一步步改进,了解什么是优质代码,在遇到任何问题都不会出错的代码,不会有漏洞
虽然上述代码可以完成任务,但是太过繁琐,可以让循环再简单一点
但是不严谨,如果arr1和arr2是空指针,程序错误但是却不报错,如果不调试很难发现。加一个assert断言函数,如果为假就报错。
但是在库函数strcpy的第二个变量是const char*,让其值不可修改,并且其返回值是char*,就可以进行链式访问。
7.例子2 const在修饰指针变量时的介绍
可以自己在cpluspluse.com网站上自己了解就不过多赘述了
const:放在指针变量的*左边时,修饰的是*p,*p不能修改,但指针变量p可修改。
*p = 0;//err
p = &ret;//ok
const:放在指针变量的*右边时,修饰的是指针变量p,指针变量p不能修改,但*p可修改。
p = &ret;//err
*p = 0;//ok
8. 编程常见的错误
8.1 编译型错误
直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。
8.2 链接型错误
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。
8.3 运行时错误
借助调试,逐步定位问题。最难搞
9.总结
在调试过程中,第一次可能不太熟练,可是调试是程序员的必备技能,等以后难得就不是写代码了而是调试,一次次调试,多用快捷键,熟能生巧,让我们的代码都没有bug,一起加油!!!
如果觉得写的不错希望一键三连,是对我最大的帮助谢谢!!!!