游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

有趣最近遇到一个狡猾的bug,复盘分享

  最近遇到一个看似青铜、实则王者的bug。
  事情是这样的,某个进程有数据解析处理、算法融合。
  数据来源是gps模块,我负责这个程序的开发维护、与算法对接。
  下面看看从这个bug的定位、分析、解决过程,一波三折
  机器之前一直正常在跑,但近两天做了一些特殊测试,发现机器走到某个位置之后基本上必会出现段错误,因为与位置相关的就是数据了,所以刚开始的时候我怀疑可能是数据解析出问题了。但是之前解析有长时间测试过,没什么问题,特殊位置也有测过没什么问题。暂时排除了数据解析的问题。定位问题
  遇到死机问题,当然得先定位问题,才能去分析、解决问题。定位段错误的方法有很多:1、log打印定位
  可以把所有打印调试信息打开,一些段错误问题可以通过打印的方法就可以大致定位到某一块代码出现问题。
  打印方式只是定位段错误的一个小尝试而已,不要对其结果抱有太大希望。有时候确实可以很快就定位到问题的根源,但针对本次的bug,通过打印的方式定位出的结果反而给我们带来了一些迷惑。
  本次的bug通过打印的方式也锁定到了出问题的代码,在某个算法函数里的某两个个三角函数的算式。问题就是屏蔽掉这个算式,程序就没出现段错误,打开这两句代码就必出现段错误,这让我的注意力集中在了这个地方。
  但反反复复看了好多次没发现这两个算式有什么不妥的地方,而且看了前后两层函数,也没发现有什么不妥。最后定位出了问题,这里确实不是问题的根源,但却在这浪费了很多时间。
  应该有很多小伙伴跟我有同样的习惯,喜欢通过打印法来查找bug,打印法基本能定位到大多数问题。但对于一些藏得很深的bug,通过打印法有时候只看到了表象,而我们有时候会被这表象给迷惑了。所以在分析问题的时候,尽量头脑清醒些,分析遇到不太合理的地方,要不断的推敲,不断地推翻不合理地分析。
  当然,有好的定位问题的方法也很重要,下面看第二种定位段错误的方法:2、远程调试
  远程GDB是一种适合嵌入式系统的调试手段。它使用目标机端的gdbserver和主机端的gdb调试器协同进行调试,再搭配vscode可以很方便地进行调试。vscodegdbgdbserver远程调试的教程见:手把手教你使用VSCodegdbgdbserver调试ARM程序原创。
  远程GDB的原理是:
  有一小段驻留在目标机上的代码,它被称为调试桩,也称为调试代理。调试代理负责目标机上实现由主机上的调试器发送过来的调试命令,例如:读写内存、读写寄存器、设置断点及运行被调试程序等。调试代理还要向主机调试器报告目标机上的异常事件。
  启动远程调试,全速运行,当程序出现段错误时可以很快知道出现段错误的代码行号。本次的这个bug也是使用这种方法来快速定位出来的。
  除此之外还有其它很多方法来定位段错误,如使用strace工具跟踪、gdb调试core文件等方法,后续有机会再写使用分享。分析、解决问题
  通过远程调试的方法可以快速定位到本次的段错误出现在一个串口读函数里的下面这一句代码:FDSET(fd,fsread);
  通过打印发现在出现段错误时这个fd的值是一个很大的数,显然是不对的。
  在Linux中,一个进程默认可以打开的文件数为1024个,fd的范围为01023。可以通过设置,改变最大值。
  我们代码里的fd是一个静态全局变量,fd突然出现一个异常的值,通过分析可能会出现两种情况:1、串口的操作不当,没有正确打开、关闭;多个线程、进程操作了同一个串口。
  2、fd的值被非法篡改了。
  代码中对串口的操作都比较合理,所以第二种情况的可能会大些。所以开始着手确认与fd前后相邻的变量的操作。这可以通过map文件来查看,在CMakeLists。txt中生成map文件的代码如:set(CMAKEEXELINKERFLAGSWl,Mapoutput。map)
  但Linux下的map文件默认不会显示static变量的一些地址信息。刚开始时,我为了查看fd的地址,把fd前面的static暂时先去掉,就可以在map文件中找到它的地址信息,但这时候再测试并不会出现段错误的情况了,这让我们更加肯定了fd的是被篡改掉了。
  把fd前面的static去掉没有出现段错误的原因是由无static修饰,fd存放的区域不同,没有出现段错误是因为去掉static之后被篡改的就是不fd的值,所以暂时不会出现段错误。
  所以,要找到问题的根源必须得把static给加回去,然后找到fd前后相邻地址的变量。问题是有static修饰时的fd的地址信息并不会存放到map文件中。这可如何是好?
  当时没什么其它的办法,网上也查了,相关资料很少。只能把整个工程的static修饰的变量的地址挨个打印出来,这是个体力活
  还好这份并不是复杂,核心文件就那么几个,但查找过程也耗费了很多时间。最后锁定了某个源文件,然后依次把这个源文件里的static变量的值及地址给打印出来。终于,找到了fd的前一个变量,那是一个int类型的cnt计数变量:
  当查到cnt的地址正好是fd的前一个地址时,别提有多开心了当查看代码发现cnt除了忘了进行清零操作之外,没有其它操作异常的地方了。不清零也似乎不会影响到后面的fd,cnt不断递增,顶多会发生上溢。
  这时候又陷入了沉思莫非是思考的方向错了?
  在下班后饿了自己一个多小时,突然想到程序才运行一小会,cnt竟然已经计数到了一个十位数的数,再往前多打印几个相邻变量的值也竟然都是十位数的数。终于,一切好像比较明了了,这是被篡改了一块连续内存,绝对是哪里有数组越界进行写操作了。
  检查了一遍代码,果然,在一个算法函数里有对一个数组进行写操作越界了:
  这里有一个含有5个元素的float类型的数组arr,但其因为逻辑设计不当,导致有对arr〔5〕、arr〔6〕、arr〔7〕、arr〔8〕进行了写操作,而arr〔8〕的地址正好是fd的地址,所以对arr〔8〕进行写操作就篡改了fd的值,从而导致段错误死机。到了这一步一切都明了了,之前打印调试屏蔽掉的那两句算式的与这个算法函数有一定的联系,一层套一层。
  但是,后来,我同事鱼鹰钻研出了Linux下static变量地址输出到map文件的方法。在CMakeLists。txt文件中设置编译参数,如:set(CMAKECFLAGSfdatasections)set(CMAKECXXFLAGSfdatasections)
  如果本次的bug问题定位能使用这种方法,就可以很快地查找fd的相邻地址变量了。总结
  这次的bug藏得真够深的,从定位、分析到根本性耗费了一天半的时间。有时候我们通过屏蔽、打开某些代码来定位问题有可能只是bug的表象,并没有看到本质,所以应多思考问题的根源,从根本性地解决才是真正的解决。虽然这次浪费了不少时间在这,但这些bug的解决不正是经验积累吗,下次再遇到类似的bug就可以很快的挖出来。
  另外,Linux下的开发坑很多,多掌握一些调试工具、方法,对于我们快速解决问题有很大的帮助。
  猜你喜欢:
  分享一个实用的、可应用于单片机的内存管理模块
  手把手教你编写你的第一个上位机
  分享一些可以快速入门的嵌入式教程
  1024G嵌入式资源大放送!包括但不限于CC、单片机、Linux等。私信回复1024,即可免费获取!

2021下半年旗舰机怎么选?三款最佳机型推荐,适合才是最好的家里有矿在换新手机上预算不是问题的朋友来说,如何换一款时尚又拉风的手机呢?时尚,那就和今年的新机脱不开关系。拉风,那就和旗舰机脱不掉关联。今天给大家推荐三款又潮流又能打的新款旗……传三星Exynos2200在制造上遇到困难,已引入AI加速芯作为首款搭载AMDRDNA2架构GPU的SoC,三星Exynos2200相关消息已经在坊间流传了有一段时间了。这款产品将支持光线追踪和可变速率着色,传闻在3DMarkWildL……噪音导致的耳聋,戴耳鸣助听器还有效吗?建议去专业的验配中心进行完整的听力检查后,验配师会根据听损的程度及性质让你试听机器,如果没有耳鸣的话,一般的助听器就可以决定问题。什么是噪声性耳聋?噪声性耳聋是由于……论一千年一次的货币革命,聊中国数字人民币为何会突破美元霸权今天的科学技术日新月异。当我们第一次接触电视和电脑时,我们很难有影响力。然而,时代、科技和科技的每一次变化都是无数人改变命运的机会。中华人民共和国成立时,真正愿意奉献的人从旧社……风靡全球的4款手机,明白人都推荐,看看你懂不懂手机?明白人告诉你,这四款手机最值得买,一款比一款猛!1。一加9R这款手机是一加旗下的首款中端机,秉承着给消费者更多选择的权利,一加9R的性价比也是很高的,一经发布也收获……电动车解码改装锂改铅屡禁不止,新国标电动车到底得罪了谁?请您在阅读前,先点击上面的关注。感谢您的支持,我们将为您带来更多有价值的内容。新能源战略家问大家三个买车问题。为什么大家放着好好的新国标电动车不买,宁愿买二手车?为……USDT虚拟币代币交易行为的刑事司法现状及风险预防USDT(俗称泰达币)是基于稳定价值美元(USD)的代币,也是币圈使用最广泛的稳定币之一,一般买卖数字货币都少不了要用到USDT。但在我们国家,由于虚拟币本身的法律地位的尴尬,……中国芯突破成熟工艺,台积电也来横插一脚中国芯突破成熟工艺在全球芯片市场为先进制程争破头的时候,国内却更加侧重于成熟工艺芯片的发展,这看似与半导体行业的主流方向格格不入,但是却能够帮助国产芯片更快地实现自主化的……赵明数字化变革为科技行业带来新机遇来源:人民网原创稿人民网北京12月31日电(记者栗翘楚)今日,由人民网主办的2021人民财经高峰论坛主论坛环节以线上方式举办。本届论坛邀请来自政、产、学、研的各方嘉宾,围……P30发布前夜,华为先发两款新机今天下午,华为更新了华为畅享系列的产品线,发布了华为畅享9e和华为畅享9s。华为畅享9S采用了6。21英寸水滴屏,屏占比达到了89,分辨率为2340x1080,ppi达到……视频里看不到麦克风的抖音主播都是怎么录音的?短视频火爆,刷短视频已经成为大家消磨时间的习惯,各种形式的直播与视频也成了许多人的赚钱之道。我们在刷短视频时,常常看到有一些主播,视频里没有麦克风的影子,声音却很好听。那……软装行业的发展前景怎样?现在装修都是重装饰,轻装修,是软装崛起的最佳时机,上面视频就是讲解软装的发展方向的,最近有很多人问我,现在学习软装设计有前途吗?在这分析一个软装设计的薪水待遇与要学……
村级组织消防安全管理制度为了预防火灾和减少火灾危害,确保本村的消防安全及和谐稳定,经村民委员会讨论决定,制定本村消防安全管理制度。具体如下:一、本村消防工作在芦潮港镇人民政府的领导下,由村民委员会具……对话科技大咖机会难得!2021华为HDC开发者大会正价票火热作为每年一度的科技嘉年华,HDC开发者大会可谓是卧虎藏龙的群英会,技术卓越的技术大咖在此一展风采,精通各路应用科技达人在此切磋技艺,2021华为开发者大会不仅是开发者的焦点,也……全国专项整治来了,这种驾车行为将被扣分罚款,已有多人中招最近,全国多地对于驾车乱鸣笛行为展开专项整治,不合理地随意鸣笛最高将以扣3分罚款200元作为处罚。那什么情况下鸣笛会被判定为不合理地随意鸣笛呢?小木简单列举了几种情况供大家参考……1000元ITX电脑主机靠谱?AMD速龙APU处理器200元这是一篇几乎全新配件的千元RMBITX电脑主机的文章,并且,仅仅是个开始。虽然AMD有速龙APU,但别忘记INTEL方面更有QL3X这颗I7级处理器,本文只是……矿难了!500元AMD470570580挖矿显卡复活抛售矿难了!完毕!正文开始!一,500元蓝宝石RX5804G满血极光版开箱:前几天闲逛大黄鱼的时候,发现了这张显卡,不过已经无法得知真身,毕竟矿卡已经离我们远去很……尼尔机械纪元深度解析生命与意识,人之所以为人《尼尔机械纪元》这个游戏,你说他有没有哲学思想在里面,必然是有。庄子说:‘道在屎溺’,就告诉我们了道,或者更通俗点讲,哲学,或者更接地气点说,道理,其实是无处不在的。……守护童心,奇瑞小蚂蚁与你安全童行前几天,深圳的南山交警联合社区胡举办了一场交通安全小达人的知识竞赛,同时还对孩子们展开了室内的安全教育,通过一些视频和问答以及拼图的方式,让孩子们在竞赛的同时,学习到停车后场以……智能家居组件漫谈智能遥控器智能遥控器又称红外转发器,智能红外遥控器,是智能家居系统的基础组件,其功能是控制通过红外遥控来控制的电器设备,如电视、CD机、功放、空调等等。红外遥控是一类应用比较广的控……苹果产品全线降价清单最高降幅500元!4月1号,制造业增值税税率从16降至13,受此影响,苹果官网下调产品价格。其中iPhone系列降价300500不等,其他产品也有略微降幅。具体降幅有网友空什么格整理了出来……智能音箱销量达1。5亿台,六大厂商份额超九成,亚马逊继续领跑文杨剑勇在消费科技市场,智能音箱是最热门的智能硬件之一。就出货量来看,这是继智能手机、可穿戴设备之后最大的消费科技品类。根据权威调研机构StrategyAnalytics……傅高义50年前日本新中产阶级研究对今仍很有启发喜欢一个作家的书,就力图看完全系列。就像鹿先森挚爱罗恩彻诺,从《摩根财团》到《汉密尔顿传》,只要是他的书都可以无脑入。这是原话。《日本的新中产阶级》是傅高义对日本研究的奠……一如初见解锁ID。4X的隐藏技能一如初见,ID。4X是上汽大众首款MEB平台纯电动车,自1月预售发布以来,其全新造型、功能配置与电池续航等信息悉数公布。同时,消费者可通过上汽大众大众品牌官方微信,进入IDHu……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网