C语言--vs使用调试技巧

 





1.什么是bug?

1.产品说明书中规定要做的事情,而软件没有实现。

2.产品说明书中规定不要做的事情,而软件确实现了。

3.产品说明书中没有提到过的事情,而软件确实现了。

4.产品说明书中没有提到但是必须要做的事情,软件确没有实现。

5.软件很难理解,很难使用,速度超慢,测试人员站在最终用户的角度看到的问题是平常的但不是正确的。

注:产品说明书中没有提到但是必须要做的事情,软件确没有实现。软件实现了产品的功能,但是没有考虑软件在弱网络、低电量的情况下也能正常使用,而做出来的产品在弱网络或低电量的情况下报错,那么这也是一个bug

2.什么是调试?

当我们发现程序中存在的问题的时候,那下⼀步就是找到问题,并修复问题。

这个找问题的过程叫称为调试,英⽂叫debug(消灭bug)的意思。

调试⼀个程序,⾸先是承认出现了问题,然后通过各种⼿段去定位问题的位置,可能是逐过程的调

试,也可能是隔离和屏蔽代码的⽅式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码,

重新测试

调试其实就是当程序已经存在问题的时候,去找问题的过程,调试是一个动作

3.debug和release

Debug 通常称为调试版本,它包

含调试信息,并且不作任何优化,便于程序员调试程序;

程序员在写代码的时候,需要经常性的调试代码,就将这⾥设置为 debug ,这样编译产⽣的是

debug 版本的可执⾏程序,其中包含调试信息,是可以直接调试的。

Release 称为发布版本,它往往是进⾏了各种优化,使得程序在代码⼤⼩和运⾏速度上都是最优的,

以便⽤⼾很好地使⽤。当程序员写完代码,测试再对程序进⾏测试,直到程序的质量符合交付给⽤⼾

使⽤的标准,这个时候就会设置为 release ,编译产⽣的就是 release 版本的可执⾏程序,这个

版本是⽤⼾使⽤的,⽆需包含调试信息等。

release版本明显要⼩,⽽debug版本明显⼤。

4.VS调试快捷键

我们先将环境改为Dbug,Dbug环境支持调试的

调试最常使⽤的⼏个快捷键:

F9:创建断点和取消断点

断点的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执⾏到想要的位置暂停执

⾏,接下来我们就可以使⽤F10,F11这些快捷键,观察代码的执⾏细节。

条件断点:满⾜这个条件,才触发断点

int main()
{int arr[10] = { 0 };//给数组元素赋值for (int i = 0; i < 10; i++){arr[i] = i + 1;}//循环打印数组for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}//我们在进行代码调试的时候,F10进入调试,我们在12212行打了一个断点
//我们想直接跳到断点处,我们直接F5直接调过来

F5:启动调试,经常⽤来直接跳到下⼀个断点处,⼀般是 和F9配合使⽤。

F5是让程序执行到运行逻辑的下一个断点

F10:逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。

F11:逐语句,就是每次都执⾏⼀条语句,但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。在函数调⽤的地⽅,想进⼊函数观察细节,必须使⽤F11,如果使⽤F10,直接完成函数调⽤。

CTRL + F5:开始执⾏不调试,如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤

//int main()
//{
//    int arr[10] = { 0 };
//    //给数组元素赋值
//    for (int i = 0; i < 10; i++)
//    {
//        arr[i] = i + 1;
//    }
//    //循环打印数组
//    for (int i = 0; i < 10; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    return 0;
//}//我们在进行代码调试的时候,F10进入调试,我们在12212行打了一个断点
//我们想直接跳到断点处,我们直接F5直接调过来void test()
{printf("test\n");int n = 4 + 5;printf("%d\n", n);
}
int main()
{int a = 10;int b = 20;int c = a + b;test();printf("hehe\n");return 0;
}
/*
我们在遇到函数调用的时候,遇到函数调用的时候,F10直接跳过这个语句
但是F11的话我们直接进入到函数内部普通语句不能进行细化的时候,F10和F11的作用是一样的,
但是遇到函数调用的话,F11能进到函数内部
*/

5.监视和内存观察

在调试的过程中我们,如果要观察代码执⾏过程中,上下⽂环境中的变量的值,

这个时候我们就要用到监视了

#include <stdio.h>
int main()
{int arr[10] = { 0 };int num = 100;char c = 'w';int i = 0;for (i = 0; i < 10; i++){arr[i] = i;}return 0;
}

 

如何在内存中观察变量呢?

进入调试后,我们在调试窗口能看到内存

内存中的值是以16进制形式展示的

调试窗口中的自动调试会根据当前的位置将元素放出来,但是我们需要观察的元素可能会消失,一会有,一会没,

局部变量监视系统会将上下文中的局部变量

6.调试举例1

/*
求1!+2!+3!+4!+……10!的和
4!=4*3*2*1
5!=5*4*3*2*1
*/
//int main()
//{
//    int n = 0;
//    scanf("%d", &n);
//    int ret = 1;
//    for (int i = 1; i <= n; i++)
//    {
//        ret *= i;//累乘
//    }
//    printf("%d", ret);
//    return 0;
//
//}int main()
{int n = 0;int ret = 1;int sum = 0;for (n = 1; n <= 3; n++){ret = 1;for (int i = 1; i <= n; i++){ret *= i;//累乘}sum += ret;}printf("%d", sum);return 0;}
//1!+2!+3!应该是9,但是这里算出的值是15
//实际结果和预期是不相符的,这就是bug/*
通过调试,我们发现在3的阶乘的时候算出的结果是12,应该是6的//所以在3的阶乘开始计算的时候,ret就有了自己的值,是2但是每算一个数ret应该是从1开始的,为了限制ret我们应该在内循环的开始就将ret重新赋值为1这样的出来的答案就是9
*/
//更好的写法
int main()
{int n = 0;int ret = 1;int sum = 0;int i = 1;for (n = 1; n <= 4; n++){ret *= n;//累乘sum += ret;}/*n=1,那么ret=1,sum=1n=2,那么ret=1*2=2,sum=1+2=3n=3,那么ret=2*3=6,sum=6+3=9n=4,那么ret=4*6=24,sum=24+9=33当n<=x的时候,我们只用算ret*x我们再加上之前的阶乘,我们就能达到计算1-n每个数都进行阶乘的效果了ret是上个数的阶乘,乘上这个数就是这个数的阶乘了,我们再将这个数的阶乘结果和上个数的阶乘结果相加就是我们想要的结果*/printf("%d", sum);return 0;}

7.调试举例2

#include <stdio.h>
int main()
{int i = 0;//int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (i = 0; i <= 12; i++){arr[i] = 0;//这个循环条件是i<=12,存在越界情况printf("hehe\n");}return 0;
}
//这种题目我们只能通过调试来解决
//会造成死循环的情况/*
i和arr是局部变量,局部变量是放在栈区的
栈区上的内存的使用习惯是:
先使用高地址的空间,再使用低地址的空间i的地址比arr的地址高
数组随着下标的增长,地址是由低到高增长的i121110987直接覆盖到i我们这里的条件假如是i=11的话我们是不会进行死循环的,我们直接报错的但是我们i<=12的话,我们直接死循环的i和arr中间空多大空间完全是取决于编译器实现我们这个vs中间空的就是两个整型但是我们在realse版本下,我们是不会死循环的,编译器会将i的地址放到arr的下面,即是越界也不会死循环的*/

向后越界可能会覆盖到i,造成死循环的效果

8.调试举例3:扫雷

void test1(int arr3[])
{}
void test2(int arr4[3][5])
{}
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[3][5] = {1,2,3,4,5 ,2,3,4,5,6,  3,4,5,6,7};test1(arr1);test2(arr2);return 0;
}
/*
我们在数组传参的时候要想在调试窗口看到arr3内的元素
我们要输入arr3,10
不然是看不到的想看arr4的前三行我们就要输入arr4,3*/

调试过程中,要做到⼼中有数,也就是程序员⾃⼰⼼⾥要清晰的知道希望代码怎么执⾏,然后再去看

代码有没有按照我们预定的路线在执⾏。

调试是需要反复去动⼿练习的,调试是可以增加程序员对代码的理解和掌控的,掌握了调试的能⼒,

就能看到本质,就像能给程序做B超⼀样,对程序内部⼀览⽆

调试过程中,要做到⼼中有数,也就是程序员⾃⼰⼼⾥要清晰的知道希望代码怎么执⾏,然后再去看

代码有没有按照我们预定的路线在执⾏。

调试是需要反复去动⼿练习的,调试是可以增加程序员对代码的理解和掌控的,掌握了调试的能⼒,

就能看到本质,就像能给程序做B超⼀样,对程序内部⼀览⽆

9.编程常见错误归类

常见的错误的归类:

1.编译型错误

2.链接型错误

3.运行时错误

编译型错误一般是语法错误,是最简单的错误,熟悉语法后,会减少错误的

链接型错误:

看错误提⽰信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。⼀般是因为

• 标识符名不存在

• 拼写错误

• 头⽂件没包含

• 引⽤的库不存在

9.3 运⾏时错误

运⾏时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运⾏时问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3中使用弹幕组件vue-danmaku

1、最开始使用的是vue3-marquee&#xff0c;后面发现一直有一个bug无法解决&#xff0c;就是鼠标hover到第一个弹幕上字体就会变粗&#xff0c;已经提了issue给作者&#xff0c;但是目前还未答复&#xff0c;所以就换了方案。 地址如下&#xff1a; https://github.com/megasa…

stable-diffusion-webui-colab搭建SadTalker由图生成视频人

在这里选择一个stable-diffusion-webui-colab ​​​​​​​​​GitHub - camenduru/stable-diffusion-webui-colab: stable diffusion webui colab 这里我选择是&#xff1a; https://colab.research.google.com/github/camenduru/stable-diffusion-webui-colab/blob/main…

【Python时序预测系列】基于LSTM实现多输入多输出单步预测(案例+源码)

这是我的第312篇原创文章。 一、引言 单站点多变量输入多变量输出单步预测问题----基于LSTM实现。 多输入就是输入多个特征变量 多输出就是同时预测出多个标签的结果 单步就是利用过去N天预测未来1天的结果 二、实现过程 2.1 读取数据集 dfpd.read_csv("data.csv&qu…

CSS-实例-div 水平居中 垂直靠上

1 需求 2 语法 3 示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格水平居中、垂直靠上示例…

AI 上车的一些随想

​最近一直在做AI大模型上车的战略企划工作&#xff0c;听了好多供应商的宣讲&#xff0c;自己也查阅了大量书籍、资料。信息输入呈现爆炸性增长&#xff0c;受限于专业知识水平&#xff0c;仅能在应用层面上有所思考。纯个人观点&#xff0c;仅供参考。 车自古以来都是移动工…

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 10 题,每题 2 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

前端面试题(基础篇十四)

一、DOMContentLoaded 事件和 Load 事件的区别&#xff1f; 当初始的 HTML 文档被完全加载和解析完成之后&#xff0c;DOMContentLoaded 事件被触发&#xff0c;而无需等待样式表、图像和子框架的加载完成。 Load 事件是当所有资源加载完成后触发的。 二、简述一下你对 HTML 语…

机器学习 中数据是如何处理的?

数据处理是将数据从给定形式转换为更可用和更理想的形式的任务&#xff0c;即使其更有意义、信息更丰富。使用机器学习算法、数学建模和统计知识&#xff0c;整个过程可以自动化。这个完整过程的输出可以是任何所需的形式&#xff0c;如图形、视频、图表、表格、图像等等&#…

理想汽车提出3DRealCar:首个大规模3D真实汽车数据集

理想提出3DRealCar&#xff0c;这是第一个大规模 3D 实车数据集&#xff0c;包含 2500 辆在真实场景中拍摄的汽车。我们希望 3DRealCar 可以成为促进汽车相关任务的宝贵资源。 理想汽车提出3DRealCar&#xff1a;首个大规模3D真实汽车数据集! 我们精心策划的高质量3DRealCar数…

全球点赞第一起名大师颜廷利:是金子总会“花光”的

在物质世界的繁华背后&#xff0c;隐藏着一个深刻的真理&#xff1a;有形之物的分享会逐渐减少&#xff0c;而无形之物的传递却能不断增值。金钱、货币、银两这些商业领域的实体&#xff0c;往往激发出人类对更多财富的渴望和对资源枯竭的恐惧。这种恐惧源于资源的有限性&#…

【数据结构】(C语言):二叉搜索树

二叉搜索树&#xff1a; 树不是线性的&#xff0c;是层级结构。基本单位是节点&#xff0c;每个节点最多2个子节点。有序。每个节点&#xff0c;其左子节点都比它小&#xff0c;其右子节点都比它大。每个子树都是一个二叉搜索树。每个节点及其所有子节点形成子树。可以是空树。…

PointNet++论文导读

PointNet论文导读 主要改进网络结构&#xff1a;非均匀采样下的特征学习的鲁棒性利用点特征传播处理数据集分割 论文链接:https://arxiv.org/abs/1612.00593 主要改进 PointNet的基本思想是学习每个点的空间编码&#xff0c;然后将所有单个点的特征聚合成一个全局点云标签&am…

Apache Ranger 2.4.0 集成hadoop 3.X(Kerbos)

1、安装Ranger 参照上一个文章 2、修改配置 把各种plugin转到统一目录&#xff08;源码编译的target目录下拷贝过来&#xff09;&#xff0c;比如 tar zxvf ranger-2.4.0-hdfs-plugin.tar.gz tar zxvf ranger-2.4.0-hdfs-plugin.tar.gz vim install.properties POLICY_MG…

论文阅读:Simple and Efficient Heterogeneous Graph Neural Network

Yang, Xiaocheng, Mingyu Yan, Shirui Pan, Xiaochun Ye and Dongrui Fan. “Simple and Efficient Heterogeneous Graph Neural Network.” AAAI Conference on Artificial Intelligence (2022). 论文地址&#xff1a;[PDF] Simple and Efficient Heterogeneous Graph Neural…

Bytebase 2.20.0 - 支持为工单事件配置飞书个人通知

&#x1f680; 新功能 支持 Databricks。支持 SQL Server 的 TLS/SSL 连接。支持为工单事件配置飞书个人通知。支持限制用户注册的邮箱域名。 &#x1f514; 重大变更 将分类分级同步设置从数据库配置移至工作空间的全局配置。 SQL 编辑器只读模式下只允许执行 Redis 的只读…

着色器预热?为什么 Flutter 需要?为什么原生 App 不需要?那 Compose 呢?Impeller 呢?

依旧是来自网友的问题&#xff0c;这个问题在一定程度上还是很意思的&#xff0c;因为大家可能会想&#xff0c;Flutter 使用 skia&#xff0c;原生 App 是用 skia &#xff0c;那为什么在 Flutter 上会有着色器预热&#xff08;Shader Warmup&#xff09;这样的说法&#xff1…

论文1--ViT

Vision Transformer (ViT) 论文&#xff1a;https://arxiv.org/abs/2010.11929代码&#xff1a;GitHub - google-research/vision_transformer 1.背景 &#xff08;1&#xff09;transformer在NLP很强&#xff0c;但在CV的应用还非常有限&#xff0c;在此之前只有目标检测中…

【轻量化】YOLOv8 更换骨干网络之 MobileNetv4 | 《号称最强轻量化网络》

论文地址:https://arxiv.org/pdf/2404.10518 代码地址:https://github.com/tensorflow/models/blob/master/official/vision/modeling/backbones/mobilenet.py 文章速览 文章摘要 MobileNetV4引入了一个名为Universal Inverted Bottleneck (UIB) 的新搜索模块,这个模块融合…

民用无人机企业招标投标需要资质证书详解

一、基础资质 在民用无人机企业的招标投标过程中&#xff0c;基础资质是首要考虑的因素。这些资质通常包括企业注册资质、税务登记证、组织机构代码证等。 1.1 企业注册资质 企业应具备合法的注册资质&#xff0c;即营业执照。该执照应包含企业名称、注册地址、法定代表人、…