调试(debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
一、调试的基本步骤
- 发现错误的存在;
- 以隔离、消除等方式对错误进行定位;
- 确定产生错误的原因;
- 提出纠正错误的解决办法;
- 对程序错误予以改正,重新测试;
二、Debug版本和Release版本
VS顶部菜单栏,可以切换Debug版本和Release版本
Debug称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序;
Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用;
快捷键:
- F10 逐过程和F11 逐语句,在主函数中运行时都是一句一句走,但F10不会进入函数内部,F11会进入被调的函数内部;
- F9 新建断点/切换断电 和 F5 开始调试,F5需要和断电一起用,不然就直接运行完了;
- 条件断点:想要在循环的中间某处加断点,可以右击断点->条件,写上断点停下的条件,如i = 8;
- CTRL+F5 —— 开始执行不调试,即忽略断点运行到最后;
三、查看程序当前信息
- 查看临时变量:调试—>窗口—>监视(开始调试之后才会显示)
- 查看内存信息:调试—>窗口—>内存
- 查看调用堆栈:调试—>窗口—>调用堆栈
- 查看汇编:调试—>窗口—>反汇编(右击鼠标—>转到反汇编)
- 查看寄存器信息:调试—>窗口—>寄存器
推荐书籍:《C陷阱和缺陷》
四、写优秀的代码
1)在合适的地方使用assert();
#include<assert.h>
void my_strcpy(char* dest, const char* source)
{
assert(dest != NULL); // 为假报错
assert(source != NULL);
while(*dest = *source) // 加const后如果写错*source = *dest会直接报错
{
dest++;
source++;
}
}
2)函数参数尽量用const修饰防止误修改;
int mmain()
{
const int a = 10;
a = 20; // 此处会报错,因为a是const修饰的常变量
int* ptr = &a;
*ptr = 20; //此处修改成功,这样就出现了问题
const int* ptr2 = &a; // 不能改变*ptr的值,但可以改变ptr的值
int* const ptr2 = &a; //不能改变ptr的值,但可以改变*ptr的值
}