1什么是bug
2调试是什么,有多重要?
3debug与release
4windows环境调试简绍
5一些调试的实例
6如何写出好的代码(便于调试)
7编程常见错误
1什么是bug
导致计算机出现问题就叫bug
2调试是什么,有多重要?
调试:发现和减少计算机程序和硬件仪器中程序错误的一个过程
调试的步骤
发现程序错误的存在
以隔离,消除等方法对错误定位
确定错误产生的原因
提出纠正错误的解决办法
对程序错误赋予改正,重新调试
3debug与release
debug是称为调试版本,包含调试信息,并且不做任何优化,便于调试
releas称为发布版本,进行各种优化,使程序在代码大小与运行速度上都是最优的,让用户很好的使用
文件对比debug39k,release9k
4windows环境调试简绍
1环境准备要调到debug版本下
2快捷键简绍
F5:启动调试,直接到下一个断点
F9:创建断点或者取消断点,可以让程序在任意位置停下,继而一步一步走下去
CRTL F9:禁用断点
F10:逐步调试
F11:逐语句每次执行一个语句,还可以进入函数内部
CTRL F5:开始执行但不调试
在循环中还可以设用断点条件
5调试时查看程序当期信息
5.1自动窗口
将变量列出来,但是进入函数后前面的变量不在窗口内,不够发哪个不
5.2局部变量
自动列出局部变量,也是不够方便
5.3监视
想按察谁就观察谁
a,数
当函数与局部变量名一样怎么办?
5.4查看内存
一行四列,一列代表一个字节,按二进制存入,通过十六进制显示
5.7查看堆栈
5.8查看汇编信息
5.9查看寄存器信息
调试实例
1求n的阶乘相加
#include<stdio.h>
int main()
{int n = 0;scanf("%d", &n);int i = 0, num1 = 1;int j = 0, sum = 0;for (j = 1; j <= n; j++){for (i = 1; i <= j; i++){num1 = num1 * i;}sum = sum + num1;}printf("%d\n", sum);return 0;
}
结果不对,该怎么调试查看
F10进入调试,然后窗口,监视加入变量,再逐过程查看,然后 发现在j=3时num1=12
反推是因为上一次num1=2没有重置导致后面多乘一个2
修改后
for (j = 1; j <= n; j++){num1 = 1;for (i = 1; i <= j; i++){num1 = num1 * i;}sum = sum + num1;}
实例2
为什么该代码执行之后是死循环(恰好在该VS环境下的一中可能)
#include<stdio.h>
int main()
{int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (i = 0; i <= 12; i++){arr[i] = 0;printf("hh\n");}return 0;
}
调试:
当进行到arr【12】时i变成0,又重复,对i与arr【12】取地址查看,发现地址一样,在同一块内存空间,
原因
在栈区域,习惯先使用高地址内存再到低区域延申
数组随着下标增长,地址是由低地址到高地址
只要空间处理合适,数组越界到i的空间去就会导致这种情况
6如何写出好的代码(便于调试)
6.1优秀的代码
1bug少
2可读性高
3效率高
4注释清楚
5文档齐全
6可维护性高
6.2常见的技巧
1使用assert
2const
3风格
4避免陷阱
//模拟实现strcpy
#include<stdio.h>
void my_strcpy(char* arr1, char* arr2);
int main()
{char arr1[20] = "xxxxxxxxxx";char arr2[] = "hellow bit";my_strcpy(arr1, arr2);printf(" %s\n",arr1);return 0;
}
void my_strcpy(char* arr1, char* arr2)
{//当遇到\0时停止while (*arr2!='\0'){//将arr2赋值给arr1*arr1 = *arr2;//再让他们增加一直到最后一位arr1++;arr2++;}//再打印\0*arr1 = *arr2;}
进阶
void my_strcpy(char* arr1, char* arr2)
{//当遇到\0时停止while (*arr1++ = *arr2++);
}
进阶的进阶
//防止放反了
void my_strcpy(char* arr1,const char* arr2)
{//防止指针是空指针assert(arr1 != NULL);assert(arr2 != NULL);while (*arr1++ = *arr2++);
}
关于const
const int a = 10;//a=20,此时不行,const让a只有可读属性//相当于关了门,打开窗int* pa = &a;*pa = 20;
//const*p说名不能通过*p去改变//*const不能通过&p去改变