程序员成长之旅——代码调试技巧
bug是什么
bug是一个英文单词,本意是指昆虫、小虫、损坏、犯贫、缺陷、窃听器等意思。现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。
https://baike.baidu.com/item/bug/32708?fr=kg_qa
调试是什么
程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试。根据测试时所发现的错误,进一步诊断,找出原因和具体的位置进行修正。简而言之调试就是在运行之前排查,逐一排错的过程,争取运行之后不会报错。
调试的基本步骤
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确认错误产生的原因
- 提出纠正错误解决的方法
- 对程序错误予以改正,重新测试
debug和release的介绍
debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序。release称为发布版本,它往往是进行各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。
debug和release环境的结果
debug和release的反汇编结果
所以我们说调试是在debug版本下进行的
那么编译器进行了那些优化呢?
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
我们运行一下不难发现debug版本下是死循环,release版本下不是死循环,那么它们之间有啥区别呢?
死循环的原因就是主函数是在栈中开辟了空间,而栈是先使用高地址,在使用低地址,也就是说先给i开辟的空间放在高于下面开辟数组地址的地址中,而数组的元素地址是从低到高的,所以,数组越界就有可能和i的地址相同,从而导致死循环。
虽然越界访问了,但是并没有死循环,这就是release版本下的优化,它将i的地址存在了小于数组首元素地址中的地址上了。
变量在内存中开辟的顺序发生了改变,影响到了程序执行的结果。
windows环境的调试
这里我说的都是vs编译器
调试环境的准备
debug版本下才可以调试。
调试的快捷键
F5
启动调试,经常用来直接调到下一个断点处
F9
创建断点和取消断点
F10
逐过程
F11
逐语句
Ctrl + F5
开始执行不调试
更多快捷键
调试的时候查看程序当前信息
只需要点击调试->窗口就可以看到你想看到的东西,再点击进去就行了
如何写易于调试的代码
优秀的代码
- 代码运行正常
- bug很少
- 效率高
- 可读性高
- 可维护性高
- 注释清晰
- 文档齐全
常见的coding技巧
- 使用assert
- 尽量使用const
- 养成良好的编码风格
- 添加必要的注释
- 避免编码的陷阱
编程常见的错误分类
编译型错误
直接看错误信息,双击,找到错误出处,改正即可,相对简单
链接型错误
看错误信息,主要在代码中找到错误信息的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。
运行时错误
借助调试,逐步找错误,最难搞