范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

  最近遇到一个看似青铜、实则王者的bug。
  事情是这样的,某个进程有数据解析处理、算法融合。
  数据来源是gps模块,我负责这个程序的开发维护、与算法对接。
  下面看看从这个bug的定位、分析、解决过程,一波三折~
  机器之前一直正常在跑,但近两天做了一些特殊测试,发现机器走到某个位置之后基本上必会出现段错误,因为与位置相关的就是数据了,所以刚开始的时候我怀疑可能是数据解析出问题了。但是之前解析有长时间测试过,没什么问题,特殊位置也有测过没什么问题。暂时排除了数据解析的问题。 定位问题
  遇到死机问题,当然得先定位问题,才能去分析、解决问题。定位段错误的方法有很多: 1、log打印定位
  可以把所有打印调试信息打开,一些段错误问题可以通过打印的方法就可以大致定位到某一块代码出现问题。
  打印方式只是定位段错误的一个小尝试而已,不要对其结果抱有太大希望。有时候确实可以很快就定位到问题的根源,但针对本次的bug,通过打印的方式定位出的结果反而给我们带来了一些迷惑。
  本次的bug通过打印的方式也锁定到了出问题的代码,在某个算法函数里的某两个个三角函数的算式。问题就是屏蔽掉这个算式,程序就没出现段错误,打开这两句代码就必出现段错误,这让我的注意力集中在了这个地方。
  但反反复复看了好多次没发现这两个算式有什么不妥的地方,而且看了前后两层函数,也没发现有什么不妥。最后定位出了问题,这里确实不是问题的根源,但却在这浪费了很多时间。
  应该有很多小伙伴跟我有同样的习惯,喜欢通过打印法来查找bug,打印法基本能定位到大多数问题。但对于一些藏得很深的bug,通过打印法有时候只看到了表象,而我们有时候会被这表象给迷惑了。所以在分析问题的时候,尽量头脑清醒些,分析遇到不太合理的地方,要不断的推敲,不断地推翻不合理地分析。
  当然,有好的定位问题的方法也很重要,下面看第二种定位段错误的方法: 2、远程调试
  远程GDB是一种适合嵌入式系统的调试手段。它使用目标机端的gdbserver和主机端的gdb调试器协同进行调试,再搭配vscode可以很方便地进行调试。vscode+gdb+gdbserver远程调试的教程见:手把手教你使用VSCode + gdb + gdbserver调试ARM程序原创。
  远程GDB的原理是:
  有一小段驻留在目标机上的代码,它被称为调试桩,也称为调试代理。调试代理负责目标机上实现由主机上的调试器发送过来的调试命令,例如:读写内存、读写寄存器、设置断点及运行被调试程序等。调试代理还要向主机调试器报告目标机上的异常事件。
  启动远程调试,全速运行,当程序出现段错误时可以很快知道出现段错误的代码行号。本次的这个bug也是使用这种方法来快速定位出来的。
  除此之外还有其它很多方法来定位段错误,如使用strace工具跟踪、gdb调试core文件等方法,后续有机会再写使用分享。 分析、解决问题
  通过远程调试的方法可以快速定位到本次的段错误出现在一个串口读函数里的下面这一句代码: FD_SET(fd,&fs_read);
  通过打印发现在出现段错误时这个fd的值是一个很大的数,显然是不对的。
  在Linux中,一个进程默认可以打开的文件数为1024个,fd的范围为0~1023。可以通过设置,改变最大值。
  我们代码里的fd是一个静态全局变量,fd突然出现一个异常的值,通过分析可能会出现两种情况: 1、串口的操作不当,没有正确打开、关闭;多个线程、进程操作了同一个串口。
  2、fd的值被非法篡改了。
  代码中对串口的操作都比较合理,所以第二种情况的可能会大些。所以开始着手确认与fd前后相邻的变量的操作。这可以通过map文件来查看,在CMakeLists.txt中生成map文件的代码如: set(CMAKE_EXE_LINKER_FLAGS "-Wl,-Map=output.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(CMAKE_C_FLAGS "-fdata-sections") set(CMAKE_CXX_FLAGS "-fdata-sections")
  如果本次的bug问题定位能使用这种方法,就可以很快地查找fd的相邻地址变量了。 总结
  这次的bug藏得真够深的,从定位、分析到根本性耗费了一天半的时间。有时候我们通过屏蔽、打开某些代码来定位问题有可能只是bug的表象,并没有看到本质,所以应多思考问题的根源,从根本性地解决才是真正的解决。虽然这次"浪费"了不少时间在这,但这些bug的解决不正是经验积累吗,下次再遇到类似的bug就可以很快的挖出来。
  另外,Linux下的开发坑很多,多掌握一些调试工具、方法,对于我们快速解决问题有很大的帮助。
  猜你喜欢:
  分享一个实用的、可应用于单片机的内存管理模块
  手把手教你编写你的第一个上位机
  分享一些可以快速入门的嵌入式教程
  1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复1024,即可免费获取!

315晚会曝光丨下载1款软件捆绑6个!软件下载平台高速下载竟为元凶很多用户在想要安装软件的时候,可能会去一些专门的软件网站去下载。pc6下载站自称是国内排名前三的软件下载平台。在pc6下载站中,记者尝试下载这款名为福昕PDF的软件,有本地下载和高为什么骁龙8不叫处理器,开始叫移动平台了?从2007年高通推出旗下第一款移动处理器SnapdragonS1开始,高通在消费者心中的印象就和处理器划上了等号,尤其是后续骁龙系列处理器在手机行业大放异彩,更是让更多人知道了高通京东入驻限时政策,母婴商家减免6个月平台使用费知舟京东入驻速度与激情过后,精耕细作,细水长流,正成为母婴行业发展的新主题。母婴零售以及与洗护婴童食品等相关的母婴童产品最为吸金。如在婴幼儿食品领域,新消费企业仍有机会通过产品创新巨大飞跃!给英伟达1。6万亿个晶体管,它就能承托全球互联网流量英伟达(Nvidia)一年一度的GTC大会如期而至,两年一更新的GPU架构Hopper也正式亮相。今年,NVIDIA创始人兼CEO黄仁勋在英伟达新总部大楼发布了一系列新品,从新架构中国开发者现状调查报告30至40岁程序员比例上升,近六成从业者不反对大小周实习记者王月竹近日,IT技术交流平台CSDN发布20212022中国开发者现状调查报告。报告显示,30至40岁从业者占比上升至19,近六成开发者为了高报酬可以支持或考虑大小周,约一币圈那些事尼日利亚支付应用KurePay将因政府打击加密货币而暂停运营金色财经报道,尼日利亚支付应用程序KurePay计划在政府开始打击加密货币交易所后暂停在该国的运营。KurePay将于22011年卖肾买iPhone4的少年,获偿147万,如今生活比我们想象更惨过去,人们在网上会看到这样一个梗,说有人为了买iPhone手机拿肾去换,后来甚至还专门给iPhone4取个别称叫肾4,很多人都以为这只是一个笑话,但却是真实发生过的一个案例。在20实力与定位完全不匹配!OPPOA56美图赏析三种配色各有芬芳11月1日,上架有几天的OPPOA56正式迎来首销,价格为1499元。作为A系列的新品,该机型拥有时尚外观5000mAh电池天玑700双模5G芯片等卖点,综合实力不俗。下面我们就结高能三主摄中兴Axon30Ultra真实体验报告最近,有幸体验了一把中兴最新的旗舰手机中兴Axon30Ultra,除了旗舰级手机该有的顶级配置外,最让人眼前一亮的当属三主摄设计,三主摄指的是6400万超广角主摄6400万超人文主AV音响和HiFi音响有什么区别?很多人在买音响的时候,老板会问你,是选择AV音响还是HIFI音响。此时如果你不知道AV和HIFI的区别,或者不了解自己的实际需求,就可能选错了。就好比你去点烤鱼,老板问你要蒜香口味开滴滴需不需要办证?新手滴滴司机的加入,第一个想法就是,我们用不用办证啊,不办证运管会不会抓啊,办完证以后能不能赚到钱呢,一大堆的顾虑和徘徊,归根结底还是能不能赚到钱。现在的滴滴是变化多端,就和孙悟空
现在的软件开发岗位分哪几类,它们之间又有什么区别和联系?现在市场上的软件开发主要分为前端开发工程师后端开发工程师测试开发工程师数据分析工程师算法工程师运维工程师。当然还有一些嵌入式和网络安全相关的岗位等等。想问下这些岗位之间有什么区别和目前网上比较火一件事就是联想事件,谈谈你对柳教父的看法?从古道今有一句话王子犯法以民同罪,就看联想柳教父和那几个高管他们犯沒犯国法,自要联想借用改革之名贪占国有资产和变卖国家地皮,把一个中科院变几个私人的提款机国法难容,应依法严惩。柳教电池更换需要14万元一男子炸毁特斯拉汽车特斯拉(TSLA)特斯拉(TSLA)12211309来自东方财富网因电池更换需要14万元一男子炸毁特斯拉汽车!爆破前还将马斯克形象的假人放进车内empty12月21日消息,据今日俄vivoT2携5nm强芯来袭,安排上6000mAh大电池,妥妥的中端机皇今年智能手机市场被再次重新洗牌,而vivo却在这巨大的压力带来了不俗的表现。高端市场实现一年两更,并且在核心技术上有不小的提升。再有就是面对中端市场激烈的战争,vivo比小米还要狠特斯拉再曝入门级车!售价约16万元,提供新电池体积更小更安全日前我们获取了特斯全新入门级车型Model2最新消息,新车预计将于2022年或2023年内正式发布,市场起售价格有望为25,000美元(约为16万人民币),而最终量产版车型预计将命如何看待最近曝光的小米MAX3规格曝光,6。99寸全面屏5500mAh大电池?诚如题主所述,昨日(1月15日)著名数码博主i冰宇宙在微博爆料了一款新机,据他透露该机采用6。99英寸FHD屏幕,搭载高通骁龙635处理器,同时配备3GB4GBLPDDR4RAM,特斯拉手机有望配备7000毫安电池,可免费上网,能否与苹果一战?这个世界很奇妙,卖手机的想要造车,造车的想要卖手机。苹果小米虽然主营业务是手机,但是都在快马加鞭研发电动汽车。华为虽然没有造整车,但是也在参与电动汽车的智能化进程。在看到手机企业都长安全新轿车曝光,比特斯拉Model3大一圈,才卖15万?根据规划,长安汽车旗下全新纯电动轿车C385(代号)将于明年二季度上市。近日网上车市了解到,C385规划年产能为6万辆年,月均约合5,000辆,其中纯电动车型产能与增程式(燃料电池腾讯将所持京东千亿市值股权作股东分红创下国内上市公司史上最壕分红中国网科技12月23日讯腾讯控股(00700。HK简称腾讯)今日发布公告称,公司将向其股东分配其持有京东集团(JD。O9618。HK简称京东)约4。6亿股A类普通股,在此次分配中获怎样找到优秀的APP外包公司软件开发定制时,你应该知道什么?如果你想开发商业运营类软件系统,都需要开发公司给你提供模式策划,行业定位,产品功能。北京木奇移动技术有限公司,专业的APP外包开发公司,欢迎交流合作作为Android开发,这个知识点一定要知道,官方也改了2次今天面试遇到同学说做过内存优化,于是我一般都会问那Bitmap的像素内存存在哪?大多数同学都回答在javaheap里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存存