0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

代码调试一些常见的错误

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2022-08-27 11:56 次阅读

无论你是初学者,还是软件开发领域的专家,都无法避免代码中出现错误。

我们所有人开发的代码中都有错误,因为,没有人能够彻底的了解编码过程中发生的一切。

因此,在项目开发过程中需要耗费时间,在Debug过程中同样需要耗费大量的精力。

e2208f3e-2516-11ed-ba43-dac502259ad0.png

我们只能研究我们自己,研究我们的工具,研究我们的bug,找到解决方案,帮助我们更高效的减少开发过程中出现的bug。

如何处理bug,我认为主要可以分为3个阶段:

一、预调试:在开发过程中尽量避免bug出现

二、调试:发现bug、识别bug、修复bug、移除bug

三、调试后:预估未知、未出现的bug

下面,我们来详细介绍每个阶段。

预调试

就像计算机科学家Edsger W. Dijkstra所说的那样:

"如果说调试是消除错误的过程,那么编程一定是引入错误的过程。"

如果我们通过编程给程序引入bug,那就意味着我们需要引导自己减少引入bug的数量。我把这个引导自己的过程称为 "预调试"(Prebugging)。

我在Google上搜索 "Debug"的定义,从牛津词典上看到的定义引起了我的思考。

“Debug从计算机硬件或软件中识别和消除错误的过程。”

这个定义引起了我的思考,因为我相信很多软件开发人员都是主动进行调试的。他们改进他们的工具和自己,以减少他们产生的bug数量。

虽然这个定义对于调试来说是可以接受的,但是它淡化了软件开发人员为减少bug产生而做的其他每一件事。所以我们现在就来看看这些事情。

了解你经常使用的工具

了解你经常使用的所有工具是很重要的,因为这有助于你减少编码时产生的bug。

没有办法完全避免bug的产生,但是如果你对你所使用的工具的基础知识非常健全的话,你可以避免产生一些bug。

例如,很多JavaScript用户记不住什么是返回。而有些人记不住和数组方法的区别。

如果你不是JavaScript用户,只需从你使用的语言中挑选一个内置的方法或函数,然后问自己:

这个方法需要什么样的参数?这个方法会返回什么?如果提供了一个无效的参数会发生什么?

经常问自己上述问题,可以让你学习到很多知识。

这就是如何让自己保持对经常使用的工具的基础知识的更新,尤其是在你没有太多时间主动阅读的情况下。

编码前的计划

编程似乎是一个反复尝试的工作,你需要不断尝试,直到正确为止。

许多初级软件开发人员并没有真正理解他们正在开发的程序,其中一些人在上网搜索报错信息之前,其实并没有尝试去理解错误信息。

现在,每个人似乎都觉得编程始终与“代码,代码,代码,搜索,调试”有关。

但是有必要真正了解你在做什么,以便你可以快速列出:

我们期望将什么作为输入以及这些输入的结构和特征

我们期望如何处理这些输入

我们最终期望返回的是什么

如果没有给出预期的输入,需要做些什么

简而言之,对函数或程序的输入,过程和输出进行规划不仅可以帮助你减少错误,还可以帮助你编写有效的测试用例。

e277e59a-2516-11ed-ba43-dac502259ad0.png

熟悉常见的错误信息

如果你已经熟悉了一个错误或bug,往往很容易修复。

所以,花时间研究一些常见的错误,并学习如何去修复这些错误是很重要的。现在我们就来谈谈一些常见的错误。

语法错误

每一种编程语言都有自己的规则,开发者要对违反这些规则的行为负责。

编程语言对规则的要求很严格,只要违反了这些规则,它们就会抛出错误。

例如,想象一下,你省略了一个函数或方法的括号:function{}

会抛出一个错误。

熟悉语法错误的错误信息,以及如何修复它,会让你在调试时更有优势。

我个人注意到,大多数语法错误总会提到一些关键词,帮助你找出代码中出错的部分。

e28c1f42-2516-11ed-ba43-dac502259ad0.png

返回的 "undefined"告诉我们,我们要访问的对象或属性是不可用的。如果我们敏锐地注意错误信息,就能找出问题所在。

你写的代码越多,你就越能够避免语法错误。你也可以简单地使用代码编辑器、静态检查工具,能够高亮突出语法错误。使用这些工具可以给你带来很大的帮助。

逻辑/语义错误

逻辑错误是非常棘手的问题,因为它们看山去是没有错误的--但你仍然没有得到预期的结果。

例如,确认这种错误的一个简单方法是在浏览器的控制台中检查下面的代码。

prompt("enter number") +3;

你可能希望输出一个数字,但它会返回一个字符串。

简而言之,你将不会得到预期的结果。

在编码前进行规划,了解你所使用的编程语言的基础知识,可以帮助你处理逻辑错误--前提是你要理解给你的程序要求。

编译错误

你的程序可能无法编译,因为你可能违反了编译器希望你遵守的一些规则。

所以,你正在编写的程序可能无法编译。

例如,写一个字符串时没有使用通常的引号,会导致编译错误,因为字符串必须使用引号。所以,代码将无法编译。

const name= Ayobami

这与语法错误类似,你写的代码越多,你就越能更好地处理编译错误。

你可以通过经常编译或测试你的代码来提高工作效率,减少这些错误。

资源错误

有时,你的程序可能会超过其内存限制或用尽可用资源。

这可能会导致你的应用程序停止服务或出现故障。

下面的代码是一个导致资源错误的代码的实际例子。

e29c2de2-2516-11ed-ba43-dac502259ad0.png

由于堆栈空间(即浏览器分配给函数调用链的内存)被用完,函数崩溃或使浏览器变慢。

在这种情况下,该错误是资源错误,因为它是由于用完分配的内存(资源)而发生的。

接口错误

有时候,我们设计的程序API是按照一定的方式来使用的,但是用户使用程序的方式不同,就会造成错误。

这种错误被称为接口错误。

例如,假设方法期望的是一个字符串,但我们却用一个数字来代替调用它。如果程序的开发者没有考虑到这种情况,就会导致错误。

软件中的大多数事物都遵循标准。如果你所定义的标准没有被遵循,你需要为你的用户提供错误信息或指南,以帮助他们弄清楚他们正在错误地使用应用程序。

在这种情况下,记录你的API可以提供很多帮助。

确保你的设置与工具相互匹配

有一个适合你的工具的设置是很重要的。

有时,你的操作系统可能与你的应用程序不兼容--也许是因为它需要一个较新版本的操作系统,或者它需要某个软件。

例如,如果电脑上缺少一些微软的VC运行时,WampServer可能无法在Windows操作系统上正常运行。

类似的事情也可能发生在Linux和macOS上。

你只需要确定你的设置是适合你的开发工作的。

对你的程序的功能要有确定性

"在数学、计算机科学和物理学中,确定性系统是指在系统未来状态的发展中不涉及随机性的系统。因此,一个确定性模型将始终从一个给定的起始条件或初始状态产生相同的输出"。

那么,问题是,我们如何做一个确定性的程序?

你必须确定你的程序中可以接受的数据类型,拒绝任何不符合的数据。

简而言之,你需要接受预期的数据,拒绝不符合预期的数据,或者将预期的数据通知用户。

不懂就不要用

减少bug产生的最好方法之一是只使用你了解的方法、方法和类。

如果你必须使用任何你不理解的方法或样式,在做之前先研究一下,确定对它有深入的理解。

每当你利用你不了解的东西时,很容易给你的应用程序引入不必要的bug。

学会准确打字

打字准确被低估了,因为编程更多的是思考而不是打字。但在打字时准确无误可能会帮助你减少一些语法错误、类型错误或错别字。

许多编程错误都是由简单的打字错误引起的。

准确打字的能力能够减少开发过程中的bug。

边调试边观察其他开发者

另一个有趣的提高调试技能的方法是,当其他开发者进行调试时,观察他们,这有助于看到不同的调试方法。

总会有一些我们不知道或不曾使用的工具或方法来进行调试,观察别人的调试让我们有机会发现那些我们可能不知道的工具或方法。

或者即使你知道那些不同的方法,你也可能不知道为什么或如何使用它们。

观察别人可以影响我们重新审视这些方法和工具,最终可能提高我们的调试技能。

调试

调试是编程的核心,因为它在编码时占用的时间最多。

调试主要涉及三个阶段:

(1)发现错误

(2)分析并理解错误发生的原因

(3)修复或移除bug

发现错误

发现bug首先需要了解你看到的错误信息。

毋庸置疑,错误信息就是一个bug的指南。

如果你理解了错误信息,你就可以精确地追踪到错误的位置。

但是有些错误可能会很繁琐,因为它们可能没有明确的错误信息和未知。

就像前面所说,逻辑/语义错误只是得不到我们想要的结果。

为了找到bug,你需要:

明确你的期望;检查你得到的结果;比较你的期望值和实际结果,看看差异;你可以使用调试器或其他有用的工具来快速找到这些错误;然后,你可以根据你的假设检查代码的不同部分,并执行试错来找到错误。

分析并理解错误发生的原因

找到一个bug之后,你需要弄清楚为什么代码会有这样的错误。

这样做可以帮助你建立一个高效的系统。

相反,许多开发人员只会在谷歌上搜索,并直接从StackOverflow得到的答案。

这在某些情况下是没有问题的,但最好是了解bug的原因和为什么解决方案有效。

理解bug的原因是修复bug或删除bug道路上的重要一步。

修复或移除bug

在找到并了解了bug的原因后,我们就要修复这个bug。

有的时候,当你了解了bug是什么之后,你就会毫无压力的找到解决方案。

但是,有的时候,我们的理解无论怎么努力,都找不到任何解决方案。

与其浪费时间,不如在谷歌上搜索错误信息或任何你觉得合适的信息。

你也可以问另一个人,因为其他人往往会有不同的看法。他们是中立的,这种中立性确实有助于修复一些bug。

所以,谷歌一下吧!

修复一个令人困扰的bug总是会带来巨大的兴奋。

但不要太过沉浸在兴奋中,因为修复一个bug可能会引起另一个bug。

所以,首先要确保你没有给程序引入另一个问题。

这就是为什么自动化测试很重要。

调试后

调试后需要在你已经写好的程序中预测有可能出现的bug。

它指的是你可能使用的所有机制,以确保未知的bug在危害系统或公司之前能够很容易被追踪或管理。

现在的问题是你如何做到这一点?嗯,用错误跟踪系统。

你应该在生产中拥有一个错误跟踪系统,这样你就可以很容易地发现错误,因为它们在你的应用程序推送到生产后出现。

有很多错误跟踪器,它们只需要上网搜索一下就可以了。不过这里有几个大家可以看看。

www.sentry.io

www.honeybadger.io

www.pypi.org

www.airbrake.io

www.logrocket.com

有这么多的错误跟踪器,你只需要选择一个最适合你的即可。

e34c6ad6-2516-11ed-ba43-dac502259ad0.png

结语

调试是所有软件开发人员必须培养的一项重要技能。

它是编码的核心,如果你做得好,它可以让你成为一个更好的开发者。

要想成为优秀的调试高手,你必须尽可能多地学习各种调试方法,很多方法我在本文中已经讨论过了。

现在是时候成为一名优秀的软件开发人员了,而调试可以在这条路上帮助你。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 软件开发
    +关注

    关注

    0

    文章

    555

    浏览量

    27178
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79543
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66772

原文标题:【代码调试】有哪些新手程序员不知道的小技巧?

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    浅谈matlab中的一些debug

    显示所有已设置的断点dbstep执行行或多行代码dbtype显示M文件代码和相应的行号内容不多,但是我觉得编写程序时debug是非常有用的,一些
    发表于 01-13 16:07

    Linux一些常见问题——内核编译常见错误

    Linux一些常见问题——内核编译常见错误编译2.6.31内核后重启出现insmod: error inserting '/lib/dm-region-hash.ko' : -1 Fi
    发表于 02-20 15:22

    MSP430入门的一些常见问题

    讲了MSP430入门的一些常见问题,初学者很有帮助。
    发表于 11-07 22:55

    关于ARM的一些常用代码

    关于ARM的一些常用代码
    发表于 04-25 22:19

    总线上的一些错误和解决

    关于总线上的一些错误发表图片:按照网上的方法,最后两张图片,虽然解决了怎样消除错误,但是仍然有警告,不知道怎样解决
    发表于 02-27 15:31

    一些生活当中常见的经典电路

    一些生活当中很常见的经典电路,给大家分享分享
    发表于 05-16 13:54

    keil mdk的一些常见错误解析

    近期遇到的keil mdk的一些常见错误 解析 2,USER\main.c(39):warning:#223-D: function "TP_GetAdXY"
    发表于 07-06 07:19

    写程序简单一调试就头疼?分享一些C语言调试经验

    写程序简单一调试就头疼?分享一些C语言调试经验很多同学在写C语言时,感觉最难的不是程序怎么写,而是程序写完了怎么调试。程序写出来了,自己检查着没有
    发表于 07-21 21:13

    MicroPython支持的一些常见开发板

    Python是Python 3编程语言的个简洁和快速实现,专门优化运行于个微控制器上。它基于ANSIC,语法跟Pyton 3基本致,拥有自家的解析器、编译器、虚拟机和类库等,下面是MicroPython支持的
    发表于 08-05 07:30

    介绍一些常见的汇编语句

    即使使用C/C++或者其他高级语言编程,最后也会被编译工具转换为汇编代码,并最终作为机器码存储在内存、硬盘或者其他存储器上。在调试程序时,经常需要阅读它的汇编代码.这里介绍一些自己
    发表于 12-20 06:05

    分享一些以太网常用的调试方法

    对于单phy的平台以太网技术已经很成熟,这里提供一些以太网常用的调试方法。帮助客户快速定位常见问题。 以太网常用的命令有哪些呢?如何对其进行调试呢?
    发表于 12-29 07:32

    mpu6050和stm32的一些

    ,从无到有,包含了一些调试代码的过程。分享一些坑吧,很多都是读不出来啥的,其实模块般没啥问题,我会
    发表于 02-10 07:35

    STM32中串口的一些常见问题有哪些?

    STM32中串口的一些常见问题有哪些?
    发表于 02-18 08:00

    导致PCB组装的常见错误有哪一些

    导致PCB组装的常见错误有哪一些
    的头像 发表于 09-08 12:38 3825次阅读

    c语言代码错误怎么找

    当我们编写C语言代码时,常常会遇到一些错误。这些错误可能是语法错误,逻辑错误或者是运行时
    的头像 发表于 11-24 10:05 1470次阅读