下面,随着我一起看看大家在事情中碰着的bug和解决技巧吧!
kuailewangzi8:

话说,刚参加事情的那会,给公司领导演示新开拓的产品,心情那个即激动又紧张啊,明明已经试好的产品便是没有反应,当时想咋回事,闹鬼了吗?一遍一遍的试啊,便是没反应,紧张的汗都出来了,
末了才创造原来是试验台上的电源开关忘却开了,蓝瘦,喷鼻香菇。领导走的时候脸都绿了......(我当时是太鸡冻了,大家别笑我啊!
)
Sur:
实在说到BUG,做程序的大家基本都碰着过。
BUG实在没有那么恐怖,恐怖的是,没有一个机制或者说是规则来避免发生它。
BUG产生的缘故原由,我不能说我都知道,不过我可以分享一些我自己碰着的:
1、对芯片或者是对干系编程措辞不熟习,比如,前段韶光写的一个VBA程序,右击的时候增加自定义的菜单,实际涌现了右击时涌现啦多个自定义的菜单,由于自己没有加删除自定义菜单的功能。在这里的感想便是,在编程时,既然你定义了一个变量,也便是你创造啦一条生命,你要规定好它生存的地方,和利用寿命,不能让它肆意忘形,由于你不可能只创造出一条生命,你是一个造物主,你须要对面创造的生命们卖力,至少对同一类生命是平等的。那么对付一个芯片来讲,它的资源毕竟是有限的,那么你创造的生命就不能无限利用这些资源,以是你须要规定好他们生存的周期。
2、对不熟习的东西,或者没有准确资料的时候,凭着自己的履历去揣测一些自己认为的东西,结果自己越想越有道理,越想越能说服自己,这个时候便是你迈向深渊的末了一脚。例子嘛,举一个自己亲自的经历,那次拿到一个开拓板,没有事理图(很尴尬),须要自己去确认一个开关的高电平有效还是低电平有效,结果我就确认反了,全体结果和哀求便是反的。也是事情之后的第一个正式的BUG吧。当时自己很确信自己是对的,以为自己很有道理 。哎,生活便是这样来教诲人的。做项目的时候,务必要拿到准确的资料,充分理解之后去确认你的编程,千万不要自己去揣测,即便资料不全,自己也要向资料供应者去确认你的揣测,由于他比你威信,实在事实不是这样,现实中每每涌现这种BUG是要担任务的,以是做一个程序员,你要明确自己的定位,有锅让别人去背,咱程序员不被锅。
3、没有一颗对编程敬畏的心,利用了一个变量,却不明确它的限值,不是忘却啦,便是想让它成为炸弹,见过万万千万的限值的问题,有TFT屏幕大小,图片大小,笔墨大小,电机的旋转的角度,由于这时候限值都被狗吃了,吃了
。以前淘宝有个抢红包的游戏,就和《Flappy Bird》一样,不过阿里的程序员显然忘却了限值这个东西,那个鸟可以一贯往上飞,都掉不下来的那种。大家编程时千万记住。
4、硬件也碰过,至今唯一比较值得肯定的便是一手还行的烙铁技能吧,只要不能BGA之类的封装难为我,基本其他还是可以搞定的,对了,还有一个畏惧的便是一种很密的排线接口,每次都会焊坏掉。对付硬件的BUG也有很多方面,不过面对这些非常时,我也有一套自己检讨的办法,从电源查起,一块板子你如果打消啦软件问题,那么你就可以开始电源检讨大法,芯片坏掉的实在很低,仔细去检讨你板子上的电源电路,每个电源的去看。然后针对功能的检讨,比如输入旗子暗记的问题等等。很多问题都是细节上的问题,很多问题都是角落里的问题,很多问题你碰着多了,你便是大神。
对付变量,记得明确它的类型,利用场所,分外状态下的值,高下限值
对付软件,一个好的构架,也是一个不错的开始
对付编程,请对它保持敬畏
对付BUG,请不症结怕它,碰着多了或者看多了,你便是大神
当然我以为有一种BUG不应该算作我们程序员的BUG,便是芯片用户手册缺点引起的BUG
nwcheroes:
周五才办理的一个bug,嵌入式linux系统上,开拓的一个.so供其他模块利用。系统开机的时候极小概率涌现core dump。gdb调试创造dump在std::_Rb_tree::_M_erase,这个是C++一个类里的map成员,这个类就叫类A吧。
最初查找的时候,代码一行行看,也找同事帮忙看,都没找出问题。
在复现bug的时候创造利用这个库的模块由于收到了两次电源关闭状态变更的(据同事说这里是为了处理某个bug添加的),导致调用了两次类A的析构函数,这就导致系统去开释了两次map成员,第一次开释map中有数据没问题,但第二次开释由于map已经是空的了,以是系统再调_M_erase就会导致core dump。
末了办理的方法是在析构函数里加入手动清空map的代码,map.clear(),这个函数纵然map是空的也可以利用。
以是搞这种linux系统开拓各个模块间的耦合度不能太高啊,单独调试一个模块没有问题,一旦联调就各种莫名其妙的bug
qwerghf:
同样在调试207程序的过程中,用IAR给板子下载程序,创造最初的四块板子可以运行,从库房拿的新的板子烧写进入,创造运行不了,由于这次电路不是我设计,我疑惑是电路的问题,是不是有什么不同的地方,检讨了几次以为并没有什么不同,问了硬件工程师有什么不同,硬件工程师说板子都是一批的,不会不同,以是用最出写好的固件,用jflash烧写进去,创造新的板子可以正常事情,然后就想起来缘故原由,原来是我忘却了boot烧写,由于我们的程序是boot+app,我直接用app的工程调试可以正常从app启动,如果拔下仿真器,就会由于没有boot,无法跳转到app,以是大家在往后调试boot+app工程的时候不要忘了烧写boot。最好调试后把boot+app合板烧写进入,避免这个bug。
飞行荷兰人号:
以前用430做一个串口通信7,用上位机调试怎么都调不通,但是奇怪的是,插上仿真器就正常了,仔细捋了一遍,创造插上仿真器往后全体系统唯一的不同便是共地了,事实证明确实是430板子连电脑那边的杜邦线有问题,换根线就正常了。
Bingqi23:
说一下曾经碰着过的一个车载导航的S级别Bug,当时查了好多天才办理的。
Bug征象:随机操作机器reset。
拿到这个Bug时,是一脸懵逼,情报也太少了,无从开查,只能再现。经由了2个多周的昼夜再现,终极竟然找到了100%的再现操作,天知道我是怎么碰大运创造的。
再现操作:机器供电后,Power Off/On操作反复100次,机器就会Reset。
知道了再现操作,剩下的就好办了。首先将看门狗生效后打上断点,再现,创造Reset是由于看门狗生效,被咬去世的。那便是喂狗失落败,可能程序中有去世循环。
一样平常思路是将wdt禁用,然后再现。当问题发生时,就能找到其所在的去世循环处。但是如上操作后,当再现时确创造系统调度正常,在各个Module的Task里打断点,创造都可以跑到,并没有在某处去世循环处。
于是改变了一下调查方向,从wdt入手,查找什么缘故原由导致了喂狗失落败。
由于芯片自身的硬件wdt的触发事宜都比较短,配置成最永劫光也才1.4ms旁边,对软件来说不足用。以是对硬wdt进行了一层软件封装,定周期给watchdog Task发Event。当收到Event时,喂软狗。
问题再现时,创造Event没有收到,通过断点调试,创造所有的中Event都无法进行收发了。经由一通Debug,找到了根源,是由于此时的Event行列步队已满了,事宜无法连续入队了。此时打开行列步队的内存处创造,里面都被同一个事宜塞满了。
为什么这个事宜没有人去Receive它呢?查找它的receiver,创造了问题。原来是一个已经不用的task,当初代码注释没有注释干净。而这个事宜是在每次poweron操作的时候进入event行列步队中的。
到此,全体事情的前因后果都清楚了。
每次powerOn操作的时候,会有一个无用的event入队。当进行了100次的PowerOn操作后,行列步队中就残余了100个这个无用事宜。而全体行列步队的Size也是100,于是乎,行列步队被塞满了。此后的所有event都发送失落败了。于是乎,喂软狗的那个事宜发送失落败了,于是乎,软狗喂不明晰,于是乎,狗咬去世电影,Reset了。
全体调查加修正bug过程持续了2个多周,个中的大部分韶光都用在了再现Bug上。真正调Code改Code的韶光,实际上也便是只用了一两天韶光。实在,我以为,如果有一个能百分百再现的操作手顺,这对调试Bug是一个十分主要且有用的条件。
ts1607:
做事器组碰着个问题:
做事是从Kafka里面取出数据,然后把offset存储到ssdb中,每个topic和partition都对应ssdb中不同的key,做事启动之后,每次kafka数据更新我们这边收到,然后存储之后就创造ssdb的值偶尔是-2。
这就奇怪了,最开始我们是在代码中打印存储的日志,创造没什么问题,后来去查看ssdb的日志,才创造里面每次set的时候都会对同一个key存储2次,一次精确的值,一次是-2,当-2先存储的时候那么再次读取的值便是精确的,否则便是缺点的。
最开始大家以为是代码的事,所有人一起看也没创造什么问题,然后我们疑惑是ssdb的做事器有问题,把ssdb杀掉,然后重新编译一个也是有问题,末了大家想可能是erlang的ssdb driver的问题,结果在driver中也加了打印信息,创造也就发送了一条ssdb set命令,这时候我就疑惑有可能还有个node也链接kafka然后也往这个ssdb中存取数据,那么测试就好办了,把我们的节点停掉了,然后再往kafka发,结果ssdb果真又涌现了个-2。
把这个节点停掉,启动精确的节点,果真统统正常了。
fyaocn:
说一个曾经非常低级的缺点。电源问题。
测试一个新的电路板,用5V供电,用linux系统。就随手用了1个手边的手机充电器,开始效果很好,启动,然后就正常初始化,各个模块逐个加载,但是每当运行到一半时,就溘然重启,不断循环。
正常情形下,就逐个排查问题,用万用表查电压都正常,然后就疑惑是否系统有bug,排查模块加载。当然,那个过程是很长的,但是没有任何结果。。。没找到问题。
后来,没有办法,换了一个电源,就统统OK了。
结论:这个手机充电器是山寨版,用一下子供电不敷,电压降落,板子就重启,给手机充电没有问题,由于手机也不须要连续供电。而且看起来也很正品。这个坑,碰着不明白的问题,电源有问题的可能性最大,往后知道了。
xudeng22:
说说以前做的一个产品吧。
一款量产的便携式手持产品,开机事情正常,等待检测不到传感器时,自动关机(省电设计),此时正常状态。反复开关机正常。
但是,BUG涌现了,关机后,1,2秒之类立即开机,不能启动,不能启动,不能启动。
软件有BUG,查了又查,没有BUG.
只有硬件了,对了,从电源入手,原来是用了国产某款LDO,关机时,电压低落为0V的过程太慢了,导致无法再次启动,须要3~4秒才能低落到0V。果断换了LDO,没问题了。
末了,希望国产IC越做越好。
迈尔风随:
本日就创造一个,利用keil V5对新唐的M051系列单片机进行在线调试程序,进入调试界面时都统统正常,一点击“全速运行”按钮,就弹出调试命令缺点的提示:
检讨了一下,能正常下载程序和运行,那解释连接线连接没有问题,然后就把所有干系的设置项都检讨一遍都是和以前的一样没有改动,之前的工程就能正常调试,而新的却不能。接下来重启电脑、重新打开keil、工程目录设置为全英文都没有用,还是一样的问题,没有招了只好去问度娘,看到有说是由于打开了芯片内部看门狗的事情,我的程序里确实是利用了内部看门狗,赶紧把看门狗的代码注释掉,编译、进调试,点运行,统统正常,问题办理,原来真是看门狗引起的问题,但是为什么会这样还不太清楚,大概是仿真用的时钟太快,导致看门狗复位的韶光缩短才这样?如果有大神知道缘故原由的话,希望不吝见教。
y909334873:
说说最近碰着的各种问题,首先是sd卡fatfs文件系统的时候,spi通信很正常,便是创建文件后不能直接往文件里写数据,或者只能变动已经存在的文件里面的数据。这个之后换了fatfs版本之后修复了这个问题,但是比较两个文件没有明显的不同,到现在也没搞清楚什么问题,等这段韶光忙完了要好好看看。其余便是之前有发过的窗口看门狗的问题的时候在中断函数里清完中断标志后,须要等待一段韶光,不然一贯复位。还有便是自己定义了一个char buf[]=\公众000\公众;char buf2[]=\"大众111\公众当我在后面的操作粗心的给它一个比如buf=“0000”;然后我在进行一些须要剖断\"大众\0\"大众的函数时,就会导致打印出的数据是“0000111”这样的情形,还有好多,虽说有改不完的bug,但是每一个bug都有它存在的缘故原由。找bug的过程是痛楚的
,办理bug的时候是
suoma:
arduino和enc28j60网络通信问题
下了最新的ethercard库 貌似CS接8或10 都ping 不通 是同一网段 接线是 INT - 2 , SO - 12 , SCK - 13 , RES - RES , SI - 11 , CS - 10 ,VCC - 3.3V ,GND - GND 板是UNO , 代码是用本帖的代码
提醒大家一点,很随意马虎犯,而且很暗藏的一个缺点:mac地址第一字节必须是偶数。
// PIN Connections (Using Arduino UNO):
// VCC - 3.3V
// GND - GND
// RESET - RESET;
// SCK - Pin 13
// SO - Pin 12
// SI - Pin 11
// CS - Pin 10
田鸡叫:
Server Tomcat v7.0 Server at localhost failed to start.
碰着以上问题一样平常是由于web项目中配置涌现问题,可能是利用了@WebServlet配置,同时有利用了Web.xml文件配置,导致工程和做事器开启失落败。
Target runtime com.genuitec.runtime.generic
办理方案,在工程目录下的settings文件夹中,“org.eclipse.wst.common.project.facet.core.xml”这个文件也须要修正下打开该文件,会创造<runtime name=\公众com.genuitec.runtime.generic.jee60\公众 />,把这句话去掉就可以了,回到IDE工具中刷新一下工程就办理了。
phwj2006:
超级奇葩的bug。
利用cc430无线通信,调试过程中能进入吸收中断,但是收到数据总是ff,f3,两个数字循环。无论发送什么数据,吸收端收到的永久是这两个字节。
各种找问题,发送确认发送出来了,吸收确认进入吸收中断。
查找问题,各种打消法,确认寄存器没有问题,确认流程没有问题,。便是找不到缘故原由。
后来直接用串口打印竟然是对的。
末了创造引起这个问题的缘故原由竟然是编译器BUG,变动高版本的编译器办理问题……
miaozhuang156:
就在昨天,我的手机努比亚小牛z9mini,发生一件诡异故障,手性能打电话,发短信,但便是不能上网
,无论是格式化,规复出厂设置,刷机。都没软用,从上午一贯搞到下午都没用,我一想,是不是手机硬件坏了
紧张当地还没售后,这一下不麻烦了吗,于是乎想起了客服,一问才知,原来z9mini刷机,升级操作失落误等,就随意马虎把MBN文件搞丢失,按照客服指示,按手机#626#查看MBN文件,全体文件界面为空,此时心里不禁暗喜,还好没硬伤,立时让客服把教程发过了,就开始弄,后来由于电脑上短缺驱动,费了好大劲才安装好,按教程一步一步来的,没想到还真弄好了,后来一回忆,可能是前几天在单位升级手机系统,中途网络断了一下,把MBN文件弄没了的缘故,想想真是坑啊。。。。。末了希望论坛朋友们有用z9mini手机的,如果涌现类是我这种问题可以按以下教程刷一下,但愿可以办理此类问题
wateras1:
分享下本日碰着一个奇怪问题:本日测试有线网关代码时碰着一个很奇怪的问题,吸罢手机app端发送的json格式数据,STM32直接进入到了硬件非常中断了,后来创造是定义的栈太小了,将原来的2K改成了4K,统统正常了。
剖析阐明如下:
函数的局部变量,都是存放在\公众栈\"大众里面,栈的英文是:STACK.STACK的大小,我们可以在stm32的启动文件里面设置,在startup_stm32f10x_hd.s里面,开头就有:
Stack_Size EQU 0x00000800
表示栈大小是0X800,也便是2048字节.这样,CPU处理任务的时候,函数局部变量做多可占用的大小便是:2048字节,把稳:是所有在处理的函数,包括函数嵌套,递归,等等,都是从这个\公众栈\"大众里面,来分配的.
以是,如果一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很随意马虎的事情,这时候,一样平常你会进入到hardfault....
这是初学者非常随意马虎犯的一个缺点.牢记不要在函数里面放N多局部变量,尤其有大数组的时候!
1055875333:
最近在调试电视机案子时,碰着HDCP 2.2 KEY识别不到的问题,征象及办理方法如下:
【征象】
EDID检讨正常,但接4K2K60HZ旗子暗记黑屏,HDCP 2.2 KEY一贯认不到,且打印I/tvos ( 1089): [MStarSDK] mapi_video: HDCP2_LoadKey failed.
【办理办法】
末了将hdcp2.ini里改了HDCP_RX_KEY_PATH=/data/hdcp2_key.bin
hdcp2.ini实在便是在libhdcp.tar.gz里面。以是末了让MStar更新
develop/extra/target/arm-gnueabi/libhdcp.tar.gz
tee/Apps/install/HDCP/libhdcpTA.a
更换上去即可重新编译Supernova即可。
ywlzh:
bug?
底板 stm32f103vct6 时钟在初始化的时候选择是的外部时钟,也便是晶振,启振了,初始化成功,但时钟频率一时对一时不对,硬件仿真去世活没有跳到非常里面去,开个硬件定时器,打算一秒灯闪一下,结果这个灯不按套路出牌,想怎么闪就怎么闪,CPU竟然还运行着,去世活不进非常。
办理方法:换单片机
596937862:
我是搞物联网嵌入式技能的,最近在搞关于Contiki的教材研究和编写事情,想要编写一本关于Contiki的教材并不随意马虎,由于Contiki的代码顺序很乱,代码很混乱,找一个代码来源要翻阅好几座山,才能找到,各种引用,有时候真要崩溃了。有一次写一个Rime多跳协议怎么也编译不出来,试过各种办法,每次考试测验的结果都不相同,代码改了无数遍始终找不到根源,末了才创造是调用底层代码的时候,名词少了一个y字母,我也是醉了。。。做程序员每天要被bug折磨去世。
wugx:
软件方面,我想说的是有时候bug便是一个字符的差别,短则找个几分钟,长则几天,呵呵,多亏现在的编译器越来越对程序员友好了
硬件方面,共地共源常常出问题,画pcb的时候眼睛不睁大点,一条和网格重合的线就没画,做出来的板子要被该的乱七八糟,这还是找到问题了的
。。。。。。总结一下,很多的忧郁bug都是自己的马虎大意造成的,这也没办法,几十年了,人毕竟都有局限性啊,阿Q一下。
murongyu:
上个星期碰着的怪异事宜:用FPGA做了一个波形发生器。开拓板硬件是没什么问题的。FPGA代码,理论上也是没问题的,正弦旗子暗记。测试第一天。用示波器丈量旗子暗记,创造DA输出的正弦旗子暗记抖动太大,打开余辉后,创造涌现波形跳变的情形。丈量板子上的晶振,时钟旗子暗记很稳定,没有抖动。这个时候,认为是代码的问题。可是代码从头到尾检讨了几遍,仿真了几遍,理论推导了几遍,都没有创造bug。第一天就这么忧郁的过去了。第二天,连续测,却创造输出的正弦旗子暗记不抖了,很稳定。统统正常。这个征象太奇怪了。同一个板子,同一个FPGA,同一个旗子暗记,同一个示波器,同一个探头,同一个设置,却涌现不一样的结果。第三天,第四天,又连续测了很多次,无法重现第一天的抖动征象。目前事情非常正常,没有涌现问题。怪异的事情发生过,却不能重现了。也只能说,无法阐明。
ienglgge:
lpc的一个单片机,串口和can与外界通信。有时候,收到一些can数据,就重启。can 先收到数据,串口后收到数据,正常。串口先收到数据,can后收到数据,就出问题。折腾半天。串口和can之间,貌似有些影响。后来,注释掉printf函数,靠,竟然正常了。而且,只要程序中有printf,纵然根本不实行,也有影响。编译可以通过,运行时,就有影响。全体工程中,都没有printf语句,就能正常事情。。
xueyongchao8805:
这个小BUG说大不大,说小不小。说大是由于办理的不彻底,说小是由于办理用了小trick。过程是这样的,用单片机掌握无线串口模块。如下图所示无线串口模块,掌握器是MSP430FR5969单片机。
板子做好,直接插上无线串口。图中无线串口M0,M1引脚在我的运用等分别须要时高电平和低电平,对应我的单片机IO口输出高低电平掌握。实际情形是,拿下无线串口,不插在板子上。用万用表量取对应IO口输出电压,均为低电平,高电平。把稳,前方涌现奇葩BUG
,当我把无线串口,插在板子上,再用万用表量取M0M1对应IO口输出电压,均发生改变(系统已经上电),都变成低电平,使我的无线串口无法事情在我须要的低功耗吸收状态!
!
!
,拿下来电平正常,接上电平奇葩,导致我就非常奇葩。明明IO输出电平没问题,接上就有问题。我就有问题了!
!
至心不知道怎么办理。
后来,由于无限串口仅须要事情在固定模式,即M0M1低高状态,遂直接将两个引脚直连板子的VCC和GND,才可以办理!
但是,问题的实质问题并没有找到。借此机会,广大朋友也可帮助看下!
!
huaiqiao:
不好意思,这个帖子本日晚上才有韶光回答。讲一下,比较近的一个故事吧。
是这样的,之前我来这个公司前,他们做了一批板子(5pcs),这个板子用的便是stm32f405.(有ti的电机驱动芯片,can收发器TJA1050,电磁阀MOS管驱动器等等)
先说第一个问题:
问题描述:这批板子中,有3pcs,用着,用着,不知怎么滴,VCC3.3V对地短路。然后接着便是CPU发烫。这个问题我在这个测评帖中大概讲过。(http://bbs.eeworld.com.cn/thread-496434-1-1.html)。
但是别的2pcs没有涌现过这个问题。那么末了剖析来剖析去,以为是CPU的问题。于是将CPU解焊,创造短路征象消逝。然后又重新焊接CPU,依然创造VCC3.3v对地短路(切实其实是征象重现啊)。于是,就剖析在焊接过程中的一些细节。
我们在焊接的时候,用了焊锡膏。然后用的是某宝买的洗板水。
后面做了个实验,单独焊接CPU(一个CPU30多块钱,算是挺贵的了)。也是用到焊锡膏,洗板水。结果上电创造,CPU有个引脚有轻微的火花。以是我们就以为,有可能是洗板水的问题(某宝的,不正宗,很正常)。还有可能是洗板水和焊锡膏浸染(该当是化学反应吧)后,焊锡膏勾留在cpu下面,焊锡膏高温后打仗空气中的水分,使得板子上电后有轻微火花(很小的火花)。
办理办法:后来,本来之前layout的同事,将电机驱动芯片的走线,lay板的时候线宽有点小,以是以为改版。恰好撑着改版,换了个板厂,换了个人lay板,这个征象就再也没有发生过。
除此之外,某宝的洗板水也扔了,换了成工业了无水乙醇。
第二个问题:
问题描述:这个板子利用的JTA1050的can收发器。这个芯片的供电是5V的,设计者在设计的时候把它当成了3.3V的。以是can芯片不能正常事情。
办理的办法:
①、原来好的板子,利用TI的can收发器SN65HVD232D。这个芯片的引脚跟TJA1050完备兼容;以是不用飞线,不用割PCB的铜线。
②、在第一个问题的时候,由于要改版,以是乘机将这个can芯片换成了TI的can收发器SN65HVD232D。以是这个问题也办理了。
上期回顾:分享一些网友事情中碰着的bug和解决技巧(一)









