基础知识和准备

介绍调试的基础知识和使用调试功能前需要的准备工作

在为刚开始学习编程的同学们具体介绍小熊猫C++的调试功能之前,让我们先来看一下调试的基本方法(了解调试的同学可以直接转下一节):

1 调试的基本方法

调试就是找出并修正程序中的缺陷(bug)的过程。其实,即使没有学习过编程,我们也早就做过很多次的“调试”了,只不过调试的对象不是程序,而是数学、物理试题的解题步骤罢了。是的,我们调试程序的过程,和我们检查一道数学或者物理题的解题过程是否正确其实是类似的。

我们在解数学或者物理计算题时,从已知条件出发,每一步会进行一项处理或者计算从而得到一个(中间)结果,后面的步骤在前面的步骤的计算结果上继续进行计算,最后得到结果。所以,检查的过程主要就是看:

每一步计算的逻辑是否正确(根据已经计算出来的结果,是不是该用这个定理来进行下一步计算)? 计算的结果有没有错? 想一想你就会发现,我们在用C或者C++这类命令式编程语言编写的程序其实也是如此。除了输入(cin或者scanf)和输出(printf或者cout)外,程序中的每一条语句要么就是在做计算并保存计算结果(赋值),要么就是在根据某个变量的值来决定下一步该干啥(if、while、for等)。所以,我们在调试程序时主要关注的就是:

计算的逻辑是否正确(if、while、for等语句的条件表达式写的对吗)? 计算的对吗,是否使用了正确中间结果(计算的表达式写错了没有,变量名是否写错了)? 所以,我们调试时最基本的操作就是:

对于if/while/for语句:检查程序在执行这条语句之前,条件表达式的计算结果 对于其他语句:检查程序在执行这条语句前后,相关变量或者内存中的值(或者值的变化) 显然,我们可以直接在相关的语句前后使用printf或者cout等语句输出想要检查的内容,从而进行调试。

但调试工具给了我们更多(很多时候也更加方便)的选择。

2 小熊猫的调试功能

小熊猫C++的调试功能主要可以分为两类:

  • 控制程序的执行:包括断点、单步执行系列工具等,通过“运行”菜单或者调试工具栏来访问
  • 查看程序和内存的状态:包括局部变量面板、内存面板、监视面板、调用栈面板、CPU信息窗口(对话框)等
运行菜单中的调试命令

运行菜单中的调试命令

调试工具栏

调试工具栏

监视面板

监视面板

调试面板

调试面板

3 调试前的准备

在后面的系列文章中,我们将以下面这个程序为例,介绍小熊猫的调试功能。(此程序是正确的,我们只是用它来演示调试功能的使用)

/**
 * 找出整数n的所有质因数
 */
#include <stdio.h>
#include <stdbool.h>

//判断n是否为质数
bool isPrime(int n) {
	if (n<2)
		return false;
	for (int i=2;i<n;i++) {
		if (n%i==0)
			return false;
	}
	return true;
}

int main() {
	int n;
	scanf("%d",&n);
	for (int i=2;i<n;i++) {
		if (n%i==0) { //如果i能整除n
			if (isPrime(i)) { //并且i是质数
				printf("%d\n",i);
			}
		}
	}
	return 0;
} 

绝大多数的调试工具都需要程序在编译时嵌入必要的调试信息,才能够正常工作。小熊猫C++内部所使用的gdb工具也是如此。因此,如果想让程序能被正常调试,必须要使用Debug类型的编译器配置集来编译程序,如下图所示:

选择Debug编译

选择Debug编译

注意:改变编译器配置集后,必须使用“运行”菜单中的“全部重编译”功能强制使用新编译器配置重新编译一遍程序,小熊猫C++目前不会在程序内容本身没有改动过的情况下自动重新编译程序。

最后修改 March 23, 2022: update (c2ca856c)