程序调试技巧总结

本文介绍了如何在编程中有效利用assert进行条件检查,避免隐藏错误;同时讲解了断点调试和输出调试技巧,帮助开发者定位和修复问题。从参数验证到复杂问题追踪,提升调试效率。

一、assert(断言)

作用:如果它的条件为假,则终止程序执行,并打印报错地点;这个宏通常用来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

注意

  • 程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用,断言assert是仅在Debug版本起作用的宏,用于检查“不应该”发生的情况;

  • 在调试结束后,可以在#include<assert.h>语句之前插入#define NDEBUG来禁用assert调用:

    #include <stdio.h>
    #define NDEBUG
    #include <assert.h>
    
  • 每个assert只检验一个条件,因为同事检验多个条件,如果断言失败,无法直观的判断是哪个条件失败;

    int real_add(int a, int b)
    {
        //assert(a>=0 && b>=0);	不好的使用方式
        assert(a>=0);		  //推荐的使用方式
        assert(b>=0);
        
        return a+b;
    }
    
  • 不能使用改变环境的语句,因为断言assert只在Debug版本中生效,如果这样做,在使用程序真正运行时遇到问题;

  • 断言assert和后面的语句分隔开(空一行),便于查看(个人习惯);

常用

  • 在函数开始处检验传入参数的合法性

示例

#include <iostream>
#include <assert.h>

using namespace std;

int real_add(int a, int b)
{
    assert(a>=0);
    assert(b>=0);
    return a+b;
}

int main()
{
    cout << "1 + 3 = " << real_add(1,3) << endl;
    cout << "1 + (-3) = " << real_add(1,-3) << endl;
    return 0;
}

在这里插入图片描述


二、断点调试

在编写大型程序的时候,有时候程序写着写着经常会发生,运行时崩溃的情况。此时我们就需要根据我们导致程序崩溃的操作去推测哪里出了问题。但是有一些比较隐蔽的错误,例如:野指针、越界等情况,是很难发现的;
此时就可以使用断点调试:在错误发现前的代码处打断点,然后单步跳过,去观察变量的值以及函数的调用堆栈,慢慢缩小范围,逐步把问题定位出来,然后解决。
在这里插入图片描述
在这里插入图片描述


三、输出调试

就是输出变量的值,通过变量的值去推测错误的根源,然后修正,这是最原始的调试方式。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值