在单片机或者程序开发过程中,有一个很重要的步骤就是“调试”又叫“debug”。通过调试能够迅速找到程序出现的问题,用好调试能让我们事半功倍。
“调试”的过程就是在程序段某个可能出现问题的地方打一个“断点”,程序运行到断点之后就会停止运行,之所以叫“断电”,一个可以从它的工作原理上理解,因为打断点实现程序停止的工作机理就叫“中断”,和平时用的外部中断,定时中断都是一样的。另一个还可以直观的理解,因为程序运行到这个点就“断了”,所以叫断点。
那为什么要打断点,或者说打断点的意义在哪里?首先,编写一个大一点的程序基本不可能毫无失误全部做对。不管是什么原因,总之就是程序运行结果和应该得到的结果不一样,但我们有无法很快的确定错误的地方和原因的时候,打断点的意义就凸显出来了/。整个程序我们可以把他分成几个小部分,按照如果每个小部分运行正确,那整个程序一定也运行正常的逻辑来讲,打断点就是让程序一个小部分一个小部分运行,这个过程中找到出现错误的那小部分程序段并将其改正。
如何确定俩个断点之间程序是否运行正常呢?还要用到调试过程中一个常用的功能就是“变量监测”,也就是“Watch”。通过Watch能够观察定义的每个变量的值,通过看这些值是否和预期一样来确定bug存在的地方。
下面就以VC6.0为例讲解一下具体调试的过程。程序:输入三个数并排列顺序。
#include <stdio.h>
int main()
{
int a,b,c,t; /*定义4个基本整型变量a、b、c、t*/
a=2;b=3;c=1;
if(a>b) /*如果a大于b,借助中间变量t实现a与b值的互换*/
{
t = a;
a = b;
b = t;
}
if(a>c) /*如果a大于c,借助中间变景t实现a与c值的互换*/
{
t = a;
a = c;
c = t;
}
if(b>c) /*如果b大于c,借助中间变量t实现b与c值的互换*/
{
t = b;
b = c;
c = t;
}
printf("The order of the number is:\n");
printf("%d,%d,%d",a,b,c); /*输出函数顺序输出a、b、c的值*/
return 0;
}
1.首先将断点打在第一个if语句之前,启动debug,程序运行至断点后会停止,同时监测abc变量的值。从图上可以看出,在断点之前程序只给a,b,c完成了赋值,从Watch窗口可以看到三个变量的具体值与程序赋的值一样,程序正常。
2.接着将断点打在第二个if之前。运行程序并监测三个变量。第一个断点和第二个断点之间的代码意思为如果a>b,就交换二者的值,很明显此处a<b,所以不进入第一个if判断语句,四个变量的值不变。
3.断点打在下一个if语句之前,运行程序。可以看出,程序运行至第三个断点后,有三个变量的值发生了变化且标红了,因为这一段代码的意思为如果a>c,就交换a,c的值,此处明显a>c,结果与我们预期一样,二者完成了交换。
以上就是断点调试的基本步骤,不管什么程序,步骤都大同小异,气基本原理是不会改变的,此处附上调试程序常用的选项及意义。
从左往右依次为:
(1) show next segment (单步运行)。
(2) step into (进入)。
(3) step over(跳过.;
(4) step out (跳出)。
(5) run to Cursor(运行至断点)。
(7) Watch(查看) 。