调试(一)Bug类型&VS调试-马里奥闯关成功程序运行

“工欲善其事,必先利其器。” 学习C语言必不可少的就是编译器,高效利用工具,编程事半功倍。让我们一起跟着马里奥探索集成开发环境VS的奥秘吧!!!

在这里插入图片描述


前言

VS2022是主流的集成开发环境,集成常见的的msvc编译器。
本文就VS2022使用过程中出现的错误类型以及调试进行分析。


一、编译和链接

在谈bug类型之前,理清C语言代码的运行逻辑是至关重要的。众所周知,计算机是用来解决问题的,计算机语言中各种各样的数据类型描述生活中的问题,程序员用计算机语言写代码来解决问题,程序员写出的代码到可执行程序,这个过程中出现的错误是需要我们识别和处理的。
C语言是一门编译型计算机语言,C语言源代码是文本文件,不能直接执行,要经过编译器翻译和链接器链接,生成二进制的可执行文件,方能执行;C语言源代码放在后缀为.c的源文件中,经过编译和链接生成可执行程序进行运行。一个工程会有多个源文件组成,下图展示了源程序经过编译和连接处理的过程。
其实代码运行和打怪升级是一个道理,我们要经过编译-链接-正确运行,才能达到预期结果;三个步骤任何一个出现错误都不行的,就好像

马里奥在闯关的时候在任何一个关卡没有闯过去,game就over了。

流程图

从图中我们可以看出:
1.每个源文件(文件名后缀为.c)是单独进行编译的,生成对应的目标文件(在Windows环境下的目标文件的后缀是.obj,Linux环境下目标文件的后缀是.o);
2.多个目标文件和库文件经过链接器的处理生成可执行程序(文件名后缀为.exe)。
且报错类型大体分为三种,编译性错误、链接型错误、运行错误;从上图可以很清晰地看到不同类型的错误会出现在什么地方。

  • 编译型错误导致代码无法从源文件编译为目标文件;
  • 链接型错误导致目标文件和链接库无法被链接为可执行程序;
  • 运行错误导致代码运行结果与我们期望的不符。

在第二部分详细展开三种错误类型的说明。

二、错误类型

马里奥开始了他的第一关,在这个关卡,他要避开所有错误,才能来到第二关,在任何地方出现失误就失败了,嘤嘤嘤…让我们一起帮助马里奥取得胜利吧!!!

1.编译型错误

其实编译型错误的本质是输入了计算机无法识别的语句,无论是漏输、误输还是其他,无法识别自然无法编译;编译型错误常见的是语法错误,这类错误常见于刚接触C语言,写代码“踉踉跄跄”的小白玩家。且随着学习的不断深入和对语法的熟练掌握,编译型错误的出现将会越来越少。避免编译型错误的诀窍是用心,笔者之前每次使用scanf函数都会报错,因为我总是忘记取地址符号&,当出现下图中的报错提醒时,程序已经崩溃在这里插入图片描述常见语法错误有

  • 标点符号的错误使用
    – 误用,如使用中文标点符号、将调用while函数条件间隔符;写成,
    – 漏用,比如&取地址符号

  • 拼写错误

编译型错误大多数是无法编译的,因而无法运行的(报错截图如下图所示);报错截图
因为计算机无法识别错误的信息,就比如我们和只懂英文的人交流的时候,如果写错单词,那他是无法识别我们是要表示什么的。计算机也是如此,当我们输入中文符号,不符合语法规范的代码,它是不认识,因此无法编译的;
但在解决这类问题时比较方便的是,双击报错信息,系统会自动定位到出错行或附近的位置,方便进行错误追踪和修改;但有一点需要注意,因为一处的代码错误会影响下一处的代码运行,因此有时候系统显示错误信息不仅是出错的代码,还有受到影响的其它代码出现的问题,要注意区分和辨别。
在这里插入图片描述
如图所示,双击错误列表中的报错信息,系统会自动定位到出错的语句(如图中红色框所示);
其实系统本身也会在有问题的语句进行标注(如图中蓝色框所示);
如上图紫色框所示,出现错误的是113行的语句,但初始化arr2的114行语句受到影响,因此出现错误;但在113行末尾加上分号,第114行的报错会自动消失。

2.链接型错误

马里奥在我们的帮助下度过了第一关,我们帮他解决了拼写错误、用错的中文标点、用错的标点符号、少写的&等标点符号…编译成功,源文件都编译成了对应的目标文件,有惊无险的来到了第二关-链接,让我们一探究竟吧!!!
如图,
在这里插入图片描述
在这里,马里奥要用第一关取得的碎片-目标文件链接库(包括由集成开发环境编译器实现的库函数的头文件,以及我们自定义函数的头文件,两种头文件在声明时略有不同。)进行链接,在这个过程中出现的错误是链接型错误,其实链接就是去头文件中找源文件中未声明的函数、变量等内容,如果没找到,系统就无法识别函数、变量的符号,系统就会报错,一般编译型错误出现的报错提示如下图,格式一般为“无法解析的外部符号xxx,…中引用了该符号”。
在这里插入图片描述
我们帮马里奥避开了前两关的错误,第三关需要多动脑筋哦~

3.运行错误

1.分类

其实运行错误,可分为两种,

  1. 一种是运行结果没有达到我们的预期,可以通过调试,看代码,看变量的变化,看运行结果,一步一步地找出问题,解决问题;
  2. 第二种就是upscale,比较隐藏的问题,即程序能够暂时达到我们的预期,但是当长期运行或者多个用户同时在线时,会出现意想不到的问题。一些运行错误,甚至是调试也不是那么容易观察出来的。比如内存泄漏问题,当然也是有迹可循的,因为程序一直在申请内存,却不进行内存释放,当系统无内存,程序申请内存无法执行,系统死机;现象是程序运行着运行着就死机了,但开机之后还是能正确运行。这就需要我们见多识广,总结经验。当然在这个过程中也要考虑时间复杂度、空间复杂度等因素,在我们后面有机会接触到大项目的时候,我们会发现,即使程序正常运行,在上市后也可能出现问题。在这里插入图片描述
    一位学长在一家游戏公司实习,当时写的程序在几百个玩家测试没问题之后,直接上市了。结果因为上市后,同时在线玩家过多,时间复杂度不够低,结果程序直接崩溃,有惊无险的是,有专人及时进行修复。“前车之鉴,后车之师”,这也告诉我们,程序设计特别是大型项目要考虑的因素有很多;且在出现问题后,要及时高效的解决问题,将损失降到最低。

2.解决方法

解决办法笔者认为有两种,一种直接就能看出来,大家都能看出来的肯定是比较简单的问题,根据语法进行修正即可,俗称“瞪眼法”;但经验丰富的程序猿更迅速地识别出运行错误的原因,并进行改正,且改正的方法一般在时间复杂度、空间复杂度等方面都比较优良。正如《卖油翁》所言,“无他唯手熟尔”。第二种,不是那么轻易就能看出来,基本上都得经过调试才能找出问题。调试需要细心观察,耐心分析,包括变量值的变化等。

马里奥在过关的时候有一个工具,让我们一起来看看吧!!!

二、调试

调试,就像给程序做B超、CT,将程序如何运行一览无余。

1.快捷键

在VS菜单栏点击调试即可出现调试的快捷键,需注意的是有的电脑F4-F12有各自的功能,须同时按“Fn+F5/9/10/11”才能实现功能。
在这里插入图片描述

  • F11 逐语句,
  • F10 逐过程,二者区别,如果碰到函数,F11会一步一步执行函数体的语句,并在监视器显示每一步的变量等内容的变化;F10显示函数执行结果
  • F5 在端点处调试
  • F9 增加、删除断点
    因为当项目很大的时候,函数体很多,我们调试的时候无需从头到尾进行调试,此时使用F9在函数中增加断点,按F5系统自动在断点处开始调试,以及特别是循环变量循环次数较多,右击断点,选择“条件断点”,输入条件,系统会在满足条件处开始调试。
    注:断点的使用要符合规则,比如前面代码scanf函数需要输入值,需要输入之后才能跳过前面代码,来到断点处;

2.调试窗口

  • 监视
    开始调试之后,调试-窗口-监视,可以输入变量观察其变化,调试-窗口,其中还有很多功能可以探索,如自动窗口、局部变量、反汇编、寄存器等。
    监视窗口输入表达式,还可以算两个数组元素的和、两个数字的和,也可以访问数组元素地址,实例如下图所示。
    在这里插入图片描述
  • 内存:
    内存中的值,二进制太长,十六进制展示,一个16进制位对应四个二进制位,八个二进制位-一个字节,每一个字节都有一个地址;将内存中的值进行解析,很多时候没什么用,也可能不对,没法看,参考意义不大。

其实VS中有很多功能值得我们去探索!!!

三、总结

1.Bug一览

但其实在笔者看来,以程序的运行过程以及我们要解决问题的目标,我们要解决的错误为依据可以将Bug分为两大类,第一类就是陌生信息类,即程序中有计算机不认识的内容,可再分为两小类,一类是在编译过程中出现的错误,
但笔者根据所学知识以及自身理解进行分类,可能与其他版本有些不同,但无论做任何事情,

通百家之变,成一家之言

都是以不变应万变的最好决策,我们获取知识有两种途径,一种是实践型,即通过自身经历总结、反思出的个人经验;另外一种就是通过读书等途径学习前人的智慧。但其实笔者在写文章的过程中有很多内容加入了自己的想法,且目前还没有很深入的学习,简而言之,大家看东西要有批判性精神,要“看山不是山”。

在这里插入图片描述
其实前人总结学习的三重境界真的精辟,第一重,“望尽天涯路”,刚入门的我们看无边无际的C语言知识也是一望无际;第二重,跌跌撞撞,学习了语法规则,在上手敲代码的时候会出现很多问题,有时候Bug多的想哭,可缝缝补补,一次又一次的调试,看代码,看变量的变化,看代码,看运行结果,找呀找呀,改呀改呀,终于运行成功了,紧接着是下一个代码,可谓是“衣带渐宽终不悔,为伊消得人憔悴”;我们在代码的海洋里遨游,寻求知识,被Bug越挫越勇,但依然不停寻找,“众里寻他千百度”,可当我们敲了很多代码,回头望,发现一些代码的优化、修改轻而易举,蓦然回首,“那人正在灯火阑珊处”,即第三重境界也。可概括为:预览世界之大-Practice makes prefect-上升level。

2.程序猿三种境界

王国维在《人间词话》中有云,

古今之成大事业、大学问者,必经过三种之境界。“昨夜西风凋碧树,独上高楼,望尽天涯路”,此第一境也。“衣带渐宽终不悔,为伊消得人憔悴”,此第二境也。“众里寻他千百度,回头蓦见,那人正在灯火阑珊处”,此第三境也。此等语皆非大词人不能道。然遽以此意解释诸词,恐晏、欧诸公所不许也。

万事万物,C语言更是学问之大,分享程序员的三重境界,

  • 看程序是程序
  • 看程序是内存
  • 看程序是程序

第一重,“看山是山”,看程序是程序,即所见即所得,我们刚入门,看到代码、敲代码并不知道代码具体的运行逻辑,但会通过语法规则改错误,这样的代码运行结果就是这样的;
第二重,“看山不是山”,我们在学习指针、内存等概念之后,在看代码、敲代码的时候,会想到局部变量存储在栈区,数组名是地址,数组各个元素的存储是连续的等,程序与地址密不可分;
第三重,“轻舟已过万重山”,这时候的我们看一个要实现的程序,代码已经在脑海中构思好了,写代码信手拈来,小菜一碟。

好啦,马里奥闯关成功啦!去奔赴下一个关卡-函数递归啦!!!我们在写程序的时候也要一步一步地打怪升级哦~在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值