一、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;
}

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


三、输出调试
就是输出变量的值,通过变量的值去推测错误的根源,然后修正,这是最原始的调试方式。
本文介绍了如何在编程中有效利用assert进行条件检查,避免隐藏错误;同时讲解了断点调试和输出调试技巧,帮助开发者定位和修复问题。从参数验证到复杂问题追踪,提升调试效率。
17万+

被折叠的 条评论
为什么被折叠?



