社区导航

 

搜索
查看: 11590|回复: 71

[分享] 分享你遇到的那些bug和解决技巧,赢万圣节小惊喜!

  [复制链接]

8617

TA的帖子

2

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2016-10-27 15:28 | 显示全部楼层 |阅读模式
h副本.jpg
万圣节马上就要到了,周边的商场、超市已经早早的装扮起来,作为工程师的你打算怎样庆祝呢

快来坛子分享你遇到诡异程序、幽灵代码、难以理解的bug和解决技巧吧!

我们为大家准备了图中五份精美的礼物:PARKER/派克纯黑经典款 铜质笔杆 渡丽雅漆 水性圆珠笔
WechatIMG148.jpg

WechatIMG149.jpg
跟帖说说你在工作中曾经遇到的诡异问题或bug及解决问题的方法(技巧)11月4日活动结束后,将抽出5位网友送出以上礼物。

抽奖结果详见:万圣节分享bug及解决技巧颁奖








扫一扫,关注 EEWORLD 微信订阅号

行业资讯、电子趣闻、技术干货、精彩活动……尽可掌握~

评分

1

查看全部评分



回复

使用道具 举报

4193

TA的帖子

9

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2016-11-4 23:51 | 显示全部楼层
本帖最后由 huaiqiao 于 2016-11-5 00:08 编辑

不好意思,这个帖子今天晚上才有时间回复。讲一下,比较近的一个故事吧。
是这样的,之前我来这个公司前,他们做了一批板子(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。所以这个问题也解决了。



回复

使用道具 举报

172

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-10-27 15:31 | 显示全部楼层
如果你惹女朋友生气了,跪着加买买买就能解决了。如果领导要怼你,你就是是是就可以了。
什么都不会,只会水经验,请见谅。如果有什么得罪的地方,请找我们队长..................ID:lcofjp


回复

使用道具 举报

634

TA的帖子

2

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2016-10-27 15:56 | 显示全部楼层
本帖最后由 long521 于 2016-10-27 16:05 编辑

今年遇到一个BUG,一块测温的线路板,新开发的程序,发现在过高压的时候,温度竟然没变,但是老的板子是没有这种现象的,最后搞了很长时间,才发现,原来,AD的设置上出错了,但是竟然也能读出正确的AD值,解出温度值,怪异吧,怪异吧

评分

1

查看全部评分

我是一头搞电子的猪,猪是一种好色的动物,猪八戒就是代表.       


回复

使用道具 举报

6906

TA的帖子

19

TA的资源

版主

Rank: 6Rank: 6

发表于 2016-10-27 15:56 | 显示全部楼层
以前做过一个触摸开关,单片机使用MSP430G2553
项目代码是我写的,有一次同事编译后下载的代码触摸不好用
同一个硬件到我这边下载后一切正常
我又一次把代码考给他,下载还是不能用
感觉有点解释不清了
我到他电脑上用Beyond Compare软件把他编译的和我考给他的一一比较
没发现有不同的地方

重装过相同版本的IAR编译器问题也不能解决
后来在比较我这边和他那边生成的.hex文件时看到里边有一个字节不一样

然后这个问题就一直没有解决

点评

我同事遇到过,源文件一样,编译环境版本不同,编译出的HEX文件不用,包括大小和内容 烧入后,效果也不同,也是醉了。。。。  详情 回复 发表于 2016-11-9 12:36
虾哥,我大概知道你的这个问题怎么产生的。。。。哈哈哈  详情 回复 发表于 2016-11-4 23:47
很好奇同一个编译器生成的hex文件不同?确定同版本,同一个网站下载?  详情 回复 发表于 2016-10-31 22:35
这么神奇  详情 回复 发表于 2016-10-28 12:44

评分

1

查看全部评分

虾扯蛋


回复

使用道具 举报

564

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2016-10-27 15:57 | 显示全部楼层
分享一个奇葩的事,不奇葩你锤我。

事情是这样的,我做了个新板子,STM32的,图是照扒之前的,绝对好使,无明显大坑。
但是这个板子居然不能下载,一直报内核错误之类的错误。我用的是SWD下载方式。于是,我觉得是不是片子没焊好,于是检查电路,检查周边,补锡,重新刮锡,都不行,仔细看图也没看出来。于是,走上了换片子的道路,结果换了四五片,一个现象,于是,把问题定位到了硬件上。应该不是芯片的事。于是奇葩的事来了。首先,拿示波器表笔点CLK看波形,波形正常,然后突然发现下载好使了!我去,这是啥意思,表笔相当于上拉电阻?对地电容?下拉电阻?于是都试了一遍,还是无济于事。然后,我又用表笔点了一下CLK,下载成功。我去,拔掉表笔,一个悬空的表笔点CLK,居然也好使。于是我试了试万用表表笔,因为示波器表笔上有9M电阻和电容补偿,万用表表笔比较单纯,结果,也好使,最后我焊了一截导线,不出所料,好使,我把下载的速度调到K级别,依然是这种方式好使。哎╮(╯▽╰)╭,谁来解释解释。 55684940700349412.jpg
200301597928749366.jpg



点评

哥们,你这是不是布线的问题。你直接从管脚引线到下载的接插件。估计好使  详情 回复 发表于 2016-10-28 23:36
感应的高电位使然!  详情 回复 发表于 2016-10-28 09:03

评分

1

查看全部评分



回复

使用道具 举报

746

TA的帖子

2

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

荣誉会员勋章

发表于 2016-10-27 16:00 | 显示全部楼层
bug最多的还是程序端没有被执行,一般使用Debug调试,但是有的时候成百上千次的循环中不适合断点调试,所以使用串口打印,最常用的错误定位方法是:
#define MARK(s)    printf("%s,%d,%s\r\n",__FILE__,__LINE__,s)
使用就是例如MARK("tangquan");,打印出来就是main.c,115,tangquan
事实上除非出现很麻烦的问题一般我不用debug,串口大部分问题都能搞定的。

评分

1

查看全部评分

亚里士缺德


回复

使用道具 举报

1990

TA的帖子

8

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

发表于 2016-10-27 16:38 | 显示全部楼层
我也分享一个bug和解决办法吧
在调试一个电压采集板子的时候,用到linear公司的ltc1605aig,当时用的时候初学,对手册不是特别钻研,只是基本功能实现就ok,结果就是每次采集完成以后都要手动复位,但虽然也能实现功能,但就是觉得哪里不舒服。后来仔细阅读手册之后才发现,有一个管脚的电平没有设置对,芯片明明可以连续采集的。

这个bug没有造成太大的损失,但告诉我对付芯片要认真,手册是唯一可以依靠的专家。

评分

1

查看全部评分

峰回路转 希望2018延续好运


回复

使用道具 举报

491

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2016-10-27 16:41 | 显示全部楼层
1. 写入Flash的图案数据与读出显示的不同,显示不全,经仔细查找,是读出的BUFFER定义小了。
2. 非接触卡,不同卡类型的流程上处理出现问题,经查程序和分析,是一个变量用作了2个用途,增加一个变量,使得各司其职,问题得到解决。
3. 非接触卡,有年检的操作,再根据结果,对于不同卡类型,不同充值消费规则都有不同处理, 当时自测加修改程序,费了不少周折,后期在现场程序运行稳定。
总结如下,程序对于可能出现的情况处理的越全面,出现bug的几率就越低。

评分

1

查看全部评分



回复

使用道具 举报

7900

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

发表于 2016-10-27 16:49 | 显示全部楼层
就分享那天在群里说的事情吧。
其实这不是一个特定的问题,只能算 一类 问题、

这类问题是写程序里最怕遇到的一类问题,基本没有之一,就是 死机。

一个跑得好好的程序,因为你干了一件什么事,修改了一句什么代码,然后......它就死了。

一般来说,PC端程序不存在这种事情,因为它会提示你
Segment Fault 或者 windows弹出一个窗,告诉你,你非法访问了什么地址。
然后程序就自己强制退出了,不会有别的事,就是这个程序崩了而已。

而在mcu上跑的程序就不是了,一般它就会死机。
从后面我们的一些见闻。
比如说,st的库,它的assert一旦失败,无一例外就是 while(1)
而我们debug时,也经常会发现死机时,它会跑到一个名字叫 hardfault的中断里。

由此,我们可以得出一个结论:
死机,并不可怕。
它,只是系统设计时的一种机制,在程序出了什么问题时,跑到一个固定的状态。

其实这是好事。
举个非常技术性的比喻:

在计算机上跑程序(MCU当然也是一个计算机系统),本质上来说,就是使用和修改在存储器上存储的数据
——
你想,代码是数据,变量,数组也都是数据。
寄存器里存的还是数据,加法器,CPU里运行的还是数据。

因此,数据就是一切,如果你的CPU都跑飞了,就像一个疯子一样,见谁都喊是我媳妇,你觉得这世道还能继续下去么?
所以,为了让这世道能继续运转,我们发明了精神病院,而MCU没有windows/linux那么多资源,于是它发明了一种机制叫,一旦出错就给我关到死循环里去。
就像一个机器死了,就让它在那半空中瞎空转呗,这样不伤人,最多耗点电。

八年一梦,洗尽铅华,重头再来



回复

使用道具 举报

7900

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

发表于 2016-10-27 16:54 | 显示全部楼层
如前所述,现在我们知道,死机,
其实是一种保护机制,再怎么,也是一种 异常机制。
并不是什么 世界末日,更不是因为今晚月圆,狼人要变身了之类的。

说起来,我们把一个好好的程序搞死机其实并不是什么稀奇的事情。
以至于,到后来我们都能对着死机无比淡定了。

而死机多年下来,我们无一例外发现,所有的死机,有85%以上的原因是 数组越界,指针乱指。
另外那15%的机会,很可能就是,你设置的堆栈区不够大,而你还很淡定地定义了一个超大的数组,然后默默地看着它hardfault.

我最近的一次死机,就是我在做FreeUI,在MDK上的例子时引发的死机。
当时我怎么都想不明白,但最后我发现,死机的原因是 MDK版的 M0 启动文件,设置的栈区小了。

至于数组越界指针意外乱指,这种事情最常发生在大量使用指针操作,数组操作的场合,比如同样是FreeUI,去年我还没重新上班以前,我在咖啡店里深夜敲代码,就经常是半小时搞一次死机......

正是这个原因,以后每次死机我们都不会害怕,因为我们都明白肯定是因为我们哪里数组越界了。

是的,相比数组越界,堆栈区设置的不够大这种事情,其实真的很罕见。

评分

1

查看全部评分

八年一梦,洗尽铅华,重头再来



回复

使用道具 举报

1454

TA的帖子

1

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2016-10-27 16:56 | 显示全部楼层
我之前做了个程序,stm32f103的芯片,一切问题都没有,运行也ok,关键问题是软件仿真时候,点run就不动,点暂停,才显示波形,再点run 又不动,再点暂停又显示波形,把程序烧到片子里,跑了几次,没发现什么问题,重新编译了程序,依然问题存在,然后上论坛请教了下,结果图也贴了,程序也贴了,但没什么结果,可能程序太小,大家看不上吧,最后不管不顾了,重新把程序抄了一遍,所有设置都没动,居然好了,很是纳闷~~

评分

1

查看全部评分



回复

使用道具 举报

7900

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

发表于 2016-10-27 17:00 | 显示全部楼层
前面这么啰嗦,可以简单概括为:
死机,是因为你做了什么你不曾想到过的事情。

比如说数组越界这种事情,到底是怎么发生的呢?
你定义了一个 50个元素的数组,在你自己的想象里,这50个已经够了,你最多只会访问到49,但是,既然是意外引起死机,就必然是因为某个地方,你的下标无意超出了49,而你认为每次写个 if(i < 50)很麻烦。
于是,你访问到了第51个
——这里说明一下,有时候稍微超出一些,只要不触及系统的配置,是不会有事的,但如果你访问到了 第 10232352个,好吧这个这么大的数字我是故意恶心你的,那,你就死定了。

指针乱指又是一种什么情况呢?
其实指针乱指和上述的数组越界往往是类似的。
比如说,人家都告诉你,指针不要随便施加 加减以外的操作,你偏不听,你还说什么 指针是C的精华,你想玩一套神乎其神的 漂移绝技。
你以为你在秋名山呢?
结果,但凡乘除这种事情,两个数据类型不一致或者结果没有进行强转,往往一个数就能变得其大,然后......就没有然后了。

很多年前,我刚工作的时候,我也玩过指针乘除这件事情,当时我是怎么发现这个BUG得呢?
我打印那片地址的所有数据,然后我突然发现有个错误的数据看着很熟悉,啊?这不是我的一个标志值么?

稍稍做个测试,我在一个和这个功能毫无关系的地方修改了那个毫无关系的标志值,不好意思,这个值再一次出现在这个毫无关系的千里之外。
于是我决定,我一定是不小心做了什么作孽的事情。

然后才引起的死机。

说实在的,为什么我说,死机其实是一种保护机制呢?

那是因为,假如在出现这种千里之外的错误的时候,我宁可它死机,否则,我永远都不知道那片存储区里有一个数据被默默的篡改了........

八年一梦,洗尽铅华,重头再来



回复

使用道具 举报

7900

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

发表于 2016-10-27 17:08 | 显示全部楼层
那么,说了这么多,怎么防止出错呢?
其实很简单,那就是——

要用别人期望你正确使用的方式去使用。

比如一个数组,既然我只给了你50个元,请你一定不要访问超出50个;
当然我知道你不是故意的,那么,请你能不能注意检查一下下标?

也比如说,我明明就只给你分配了1K的 RAM,你能不能不要给我申请一个1025的数组?
哦,当然我知道,你根本就不会去看start文件.......

所以,我只能提出最后一招,这一招,是我在遇到这种问题,还在懵逼的时候最常用也最管用的一招。

那就是,排除法。

首先,你不可能从一开始就死机,如果从一开始就死机,那
那你就给我死回到最开始死机的地方去!

然后,你要明白,引起死机,必然是你最近干的事情,有可能是你修改的代码,当然也可能是某些配置,这种,我是最烦了。(后来我明白,最烦的原因是,我一直希望这些不用我操心,IDE IDE,你就不能让我省点心么?)

然后,你把你新增的代码

注释掉。

看看还死不死?

如果不死了,那——
就真的太好了。

好好检查这段代码吧。
然后想想是不是数组越界了。

一般情况下,不会那么直接,如果那么直接你都干得出来,并且毫无察觉懵逼到要动用 排除法。
那我觉得你真的太粗心了,建议你还是先好好睡一觉别熬夜,明天再说。

其实更多的时候,是不会那么直接的,而是一些比较隐秘的关系。

比如说,你在这里做了一项运算,这项运算的结果,东拉西扯的,最后导致了某个以前的位置的对某个数组的下标运算。

或者反过来,某个以前的对下标的计算,在这里发生了 下标引用的动作。
然后很不幸,哪里出现了意外下标值,于是到这里才爆发出这个错误。

其实,各种情况很多,无法一一说明。

所以我只能告诉你,唯一的办法就是,你自己去一点点地注释新增的,你觉得可能引起的代码,然后,找到一个临界点。

然后审视这段引起变化的代码。

不管是前尘往事还是新仇旧恨,我相信,你一定能找到答案。

因为,就目前为止,不管曾经发生过什么看起来很邪门的死机,到最后,无一例外我都能找到原因,不管是我干的,还是我的队友坑的。

代码诚不欺余

评分

1

查看全部评分

八年一梦,洗尽铅华,重头再来



回复

使用道具 举报

916

TA的帖子

5

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2016-10-27 17:19 | 显示全部楼层
分享一个我碰到的最蛋疼的Bug,其实也不算是什么问题,就是自己不长记性。
某次做完一块板,stm32的,然后焊完就下载程序测试,程序也能下载,就是再次下载程序的时候,下不进去了,然后查硬件:时钟,复位,电源,下载信号,发现没问题,死活就是下不进去。然后就换了一个芯片,然后又重复之前的操作,苦思冥想了好几天,最后发现串口下载可以用,然后我突然明白了什么,原来是软件设置上把SWD接口禁掉了。。

评分

1

查看全部评分

作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!


回复

使用道具 举报

846

TA的帖子

25

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2016-10-28 08:26 | 显示全部楼层
路过顶一下
这个人不懒,但是仕么都没留下


回复

使用道具 举报

329

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-10-28 09:03 | 显示全部楼层
supermiao123 发表于 2016-10-27 15:57
分享一个奇葩的事,不奇葩你锤我。

事情是这样的,我做了个新板子,STM32的,图是照扒之前的,绝对 ...

感应的高电位使然!

点评

求详解  详情 回复 发表于 2016-10-28 09:37


回复

使用道具 举报

564

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2016-10-28 09:37 | 显示全部楼层
jinglixixi 发表于 2016-10-28 09:03
感应的高电位使然!

求详解


回复

使用道具 举报

1728

TA的帖子

4

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2016-10-28 09:47 | 显示全部楼层
解决BUG还是得靠工具,先得从硬件着手,要死到头来欲哭无泪,白白浪费时间;软件调试,工具工具,看波形测数据,分析分析,应该就能解决了


回复

使用道具 举报

171

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-10-28 12:44 | 显示全部楼层
littleshrimp 发表于 2016-10-27 15:56
以前做过一个触摸开关,单片机使用MSP430G2553
项目代码是我写的,有一次同事编译后下载的代码触摸不好用
...

这么神奇

点评

要是我遇到的话,还得多查一下,电脑系统一样吗?IAR有些默认的补丁依赖系统。胡扯的。  详情 回复 发表于 2016-10-28 14:23


回复

使用道具 举报

27

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2016-10-28 14:23 | 显示全部楼层

要是我遇到的话,还得多查一下,电脑系统一样吗?IAR有些默认的补丁依赖系统。胡扯的。

点评

IAR是一个安装程序,即使不一样也不应该出现这种情况。 换另一台电脑没有装过IAR的电脑重装编译后是正常的 剩下只能是系统了,时间有限,懒的理它  详情 回复 发表于 2016-10-28 14:35


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-29 18:26 , Processed in 0.562318 second(s), 19 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表