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去改变