问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

调试入门:5大步骤+2个实战案例,轻松掌握程序除错技巧

创作时间:
2025-01-21 21:54:14
作者:
@小白创作中心

调试入门:5大步骤+2个实战案例,轻松掌握程序除错技巧

调试是程序员必备的基本功之一。本文将从调试的基本概念出发,详细讲解调试的步骤、Debug与Release版本的区别、断点的使用方法、监视窗口的运用,并通过两个实例演示如何发现和解决代码中的错误。无论你是编程初学者还是有一定经验的开发者,都能从中学到实用的调试技巧。

什么是调试?

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

调试的步骤

  1. 发现程序错误的存在
  2. 以隔离、消除等方式对错误进行定位
  3. 确定错误产生的原因
  4. 提出纠正错误的解决办法
  5. 对程序错误予以改正,重新测试

Debug与Release版本的区别

Debug版本包含调试信息,不作任何优化,便于程序员调试程序。例如,以下代码在Debug版本下的运行结果:

#include<iostream>
using namespace std;
int main()
{
    int arr[10];
    for (int i = 0; i < 10; i++)
    {
        arr[i] = i+1;
    }
    for (int i = 0; i < 10; i++)
    {
        cout << arr[i];
    }
    return 0;
}

点击调试后,在对应的文件中会创建debug文件,里面包含.exe的可执行文件:

Release版本则对代码进行了优化,调试信息较少。下图是Release版本的调试界面:

断点的使用与快捷键

断点可以在程序的任意位置设置,使得程序在指定位置停止执行,便于逐步检查代码。常用的调试快捷键有:

  • F5:启动调试,跳到下一个断点
  • F9:创建或取消断点
  • F10:逐过程执行
  • F11:逐语句执行
  • CTRL + F5:开始执行不调试

监视窗口的使用

通过以下步骤调出监视窗口:

在程序运行之后按以下顺序点击

运用监视可以看到数据具体的变化

当然运用监视还可以看到内存窗口

当前存放的整形,因此将列数设置为4,因为是16进制,两个零代表一个字节,一行就是4个字节也就是一个整形数据

当然还有其他自动窗口,局部变量等就不逐一介绍了

实战演练

实例一:计算阶乘和

实现代码:求 1!+2!+3! …+ n! ;不考虑溢出。

int main()
{
   int i = 0;
   int sum = 0;//保存最终结果
   int n = 0;
   int ret = 1;//保存n的阶乘
   scanf("%d", &n);
   for(i=1; i<=n; i++)
   {
     int j = 0;
     for(j=1; j<=i; j++)
     {
       ret *= j;
     }
     sum += ret;
   }
 printf("%d\n", sum);
 return 0;
}

通过监视窗口,可以发现ret在每次内循环结束后没有恢复初始值。

实例二:分析死循环原因

研究程序死循环的原因。

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[10] = {0};
    for(i=0; i<=12; i++)
   {
        arr[i] = 0;
        printf("hehe\n");
   }
    return 0;
}

在Debug环境中,会导致修改了i的值为0

出现如下图所示导致死循环

arr[10]与arr[11]是抽查位,但程序未结束,编译器无法进行抽查

抽查位的介绍见C++入门中空间越界小知识

在Release环境中系统做了优化就不出现死循环而是编译词报错

总结

调试需要多动手实践才能进步。除了掌握基本的调试技巧外,还应注意以下几点:

  1. 使用assert进行断言检查
  2. 尽量使用const限定符
  3. 养成良好的编码风格
  4. 添加必要的注释
  5. 避免常见的编码陷阱

记住,真相永远只有一个!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号