C语言学习笔记之程序调试

13.1什么是调试

调试:调试可以让代码一步一步的慢慢执行,我们可以跟踪程序的运行过程,可以让程序停在某个地方,查看当前所有变量的值(全局变量存在全局数据区、局部变量存在栈区)货内存中的数据。也可以步进执行或执行几个语句观察程序具体的执行情况。
作用:监控变量的值、函数的调用过程、内存中的数据、线程调度等程序细节。
注:变量的定义和初始化、内存的分配和释放。

13.2断点

断点的含义:
调试器遇到断点时会把程序暂时挂起,让程序进入中断状态,这种状态下的操作不会终止程序的执行,也不会清除与程序相关的元素,比如变量、函数等,它们在内存中的位置不会发生变化。处于中断状态下的程序允许用户查看和修改它的运行状态。

13.3查看和修改变量的值

局部变量的监视
变量的监视

#include<stdio.h>
int main() {
	int value_int, array_int[3];
	float value_float;
	char *value_char_pointer;
	//input bp1;
	value_int = 19;
	value_float = 2.0;
	value_char_pointer = "hello,world";
	array_int[0] = 17, array_int[1] = 18;
	//input bp2
	return 0;
}

13.4单步调试

单步调试:让代码一步一步执行
逐语句:可以进入函数内部
逐过程:将函数作为一个整体看待

修改代码运行位置(程序易崩溃):设置断点、移动箭头

13.5即时窗口的使用

即时窗口不能定义新的变量

调用函数:没有执行成功???

13.6查看、修改运行时的内存

C语言学习笔记之程序调试

13.7条件断点的设置

条件断点

13.8assert断言函数

assert断言函数是C语言标准库提供的assert.h函数 它的使用与操作系统无关

注:fopen函数
C语言学习笔记之程序调试

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)

int main() {
	FILE *s;
	
	s = fopen("d:\\deldel.txt", "r");
	if (s==NULL)
	{
		printf("open fail\n");
		exit(1);
	}
	else
	{
		printf("open success\n");
	}
	fclose(s);
	return 0;
}

assert函数:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#pragma warning(disable:4996)
int main() {
	FILE *s;
	s = fopen("d:\\deldeldel.txt","w+");
	assert(s);

	fclose(s);
	s = fopen("d:\\hahaha.txt","r");
	assert(s);
	
	printf("success");
	fclose(s);
	return 0;

}
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#pragma warning(disable:4996)
int main() {
	FILE *s;
	s = fopen("d:\\deldeldel.txt","w+");
	assert(s);

	fclose(s);
	s = fopen("d:\\hahaha.txt","w");
	assert(s);
	
	printf("success");
	fclose(s);
	return 0;

}

注:每次断言只能检验一个条件,这样才能利用assert函数对问题进行定位
注:自增和自减运算符的优先级高于算术运算符

注:assert函数在实际开发中如何使用???
AssertFatal函数的作用是什么???

13.9输出调试信息

合理利用调试信息捕捉工具
已经封装好的就不要自己写了,弄懂就行,关注核心代码的实现即可,加快开发效率。

13.10调试的总结

调试标记:

#include<stdio.h>
#define DEBUG
int main() {
#ifdef DEBUG
	printf("prepare for debug...\n");
#endif // DEBUG
	printf("prepare for running...\n");
	return 0;
}

调试过程;
即时窗口-断点/条件断点=逐语句/逐过程-带有逻辑的调试
注:粗心是最大的bug,要结合开源项目多加训练。

#include<stdio.h>
#include<stdlib.h>
#define PAUSE system("pause");
//#define DEBUG
#define PI 6.14
#if (defined DEBUG)
#define _DEBUGNEW
#define _put1(NUM) printf("%d\n",NUM)
#define _put2(NUM) printf("%f\n",NUM)
#else
#define _put1(NUM) printf("%d\n",NUM+NUM)
#define _put2(NUM) printf("%f\n",NUM+NUM)
#endif // define DEBUG


int main() {
#ifdef _DEBUGNEW
	printf("prepare for debug\n");
#endif // DEBUG
	
	printf("prepare for running\n");
	_put1(1);
	_put2(PI);
	PAUSE;

	return 0;
}
上一篇:(P8-P9)了不起的分支和循环:Python可以有效避免“悬挂else” ,断言(assert),while循环,break,continue


下一篇:pytest文档11-assert断言