搜索
bottom↓
回复: 35

请问:嵌入式程序一般怎么调BUG

[复制链接]

出0入0汤圆

发表于 2015-3-5 08:00:51 | 显示全部楼层 |阅读模式
一般都用什么方法?
现在程序有个严重的bug,几天解决不了,想看看大家都有什么好办法

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-3-5 08:11:50 | 显示全部楼层
1 仿真器
2 Printf

出0入0汤圆

 楼主| 发表于 2015-3-5 08:19:49 | 显示全部楼层
xhcyfc 发表于 2015-3-5 08:11
1 仿真器
2 Printf

仿真器跑的时候跟程序设计不同,有的时候子程序都不进去,不知道有人遇到类似的情况么?
所以开始就放弃了仿真器

现在用的就是Printf,但是程序有点复杂,始终定位不了最后到底哪里跑飞的,跑飞的位置很随机
有时候上电就飞,有时候跑半天才飞

出0入4汤圆

发表于 2015-3-5 08:24:27 | 显示全部楼层
log
你程序里面没有设置这个嘛?

出0入0汤圆

 楼主| 发表于 2015-3-5 08:39:37 | 显示全部楼层
agilentvee 发表于 2015-3-5 08:24
log
你程序里面没有设置这个嘛?

公司已有的程序,有log
但是log信息定位不了

出0入0汤圆

发表于 2015-3-5 08:40:22 | 显示全部楼层
打印日志 在线仿真

出0入0汤圆

发表于 2015-3-5 08:46:04 | 显示全部楼层
不要急,静下心,能重复的BUG,总是能找到的

出0入0汤圆

发表于 2015-3-5 08:48:04 | 显示全部楼层
ccrt 发表于 2015-3-5 08:19
仿真器跑的时候跟程序设计不同,有的时候子程序都不进去,不知道有人遇到类似的情况么?
所以开始就放弃 ...

程序随机性的跑飞 有可能是某些变量初始化的时候不严谨 楼主使用的是哪个编程环境

出0入54汤圆

发表于 2015-3-5 09:01:29 | 显示全部楼层
只要问题容易再现就好解决
最怕那种问题隔个10天半个月的出现一次,你就哭去吧。

出0入0汤圆

发表于 2015-3-5 09:04:34 | 显示全部楼层
容易复现的问题是好分析解决的,逐步跟踪,输出调试信息

出0入0汤圆

发表于 2015-3-5 09:21:09 | 显示全部楼层
结合你的版本管理吧,特别是调试方法很有限的情况下,一直回退到没出问题前的固件,两者对比调试。

出0入0汤圆

发表于 2015-3-5 09:25:53 | 显示全部楼层
我一般是大体先定位一下,然后使用
#if 0
#endif
把无关的模块先去掉,再加上Printf,慢慢调试,总能找到错误的位置
这样就好解决了。

出0入0汤圆

发表于 2015-3-5 09:29:22 | 显示全部楼层
这个有很多方法了。仿真,串口,led,很多体现方式。

出0入0汤圆

发表于 2015-3-5 09:30:06 | 显示全部楼层
问题是每次都出现吗?  现象是否相同?

出0入0汤圆

发表于 2015-3-5 09:47:28 | 显示全部楼层
remote debug

出0入0汤圆

 楼主| 发表于 2015-3-5 20:37:17 | 显示全部楼层
子鱼 发表于 2015-3-5 08:48
程序随机性的跑飞 有可能是某些变量初始化的时候不严谨 楼主使用的是哪个编程环境 ...

Keil4.72A

出0入0汤圆

 楼主| 发表于 2015-3-5 20:42:01 | 显示全部楼层
zhugean 发表于 2015-3-5 08:46
不要急,静下心,能重复的BUG,总是能找到的

接手别人的程序,啥都没有,也没有个人问:(
时间紧啊,哎哎,功能基本上靠猜,慢慢调我也不怕的

出0入0汤圆

 楼主| 发表于 2015-3-5 20:43:16 | 显示全部楼层
lusson 发表于 2015-3-5 09:01
只要问题容易再现就好解决
最怕那种问题隔个10天半个月的出现一次,你就哭去吧。 ...

是啊,不过这种对我们产品来说也不用调了

出0入0汤圆

 楼主| 发表于 2015-3-5 20:45:42 | 显示全部楼层
shell.albert 发表于 2015-3-5 09:25
我一般是大体先定位一下,然后使用
#if 0
#endif

感谢分享,现在就是这么做的

出0入0汤圆

 楼主| 发表于 2015-3-5 20:46:50 | 显示全部楼层
祥子 发表于 2015-3-5 09:30
问题是每次都出现吗?  现象是否相同?

基本上每次都出现,但现象不同

出0入0汤圆

发表于 2015-3-5 21:55:53 | 显示全部楼层
多次,找到能复现BUUG的原因

出0入0汤圆

发表于 2015-3-5 22:08:27 | 显示全部楼层
agilentvee 发表于 2015-3-5 08:24
log
你程序里面没有设置这个嘛?

请教一下,log怎么设置?

出0入0汤圆

发表于 2015-3-5 22:11:24 | 显示全部楼层
agilentvee 发表于 2015-3-5 08:24
log
你程序里面没有设置这个嘛?

程序里设置log是怎么搞的呢?

出0入4汤圆

发表于 2015-3-6 10:47:40 | 显示全部楼层
伍师傅32 发表于 2015-3-5 22:11
程序里设置log是怎么搞的呢?

程序里面每个动作都要记录,同时标记时间,格式如下
年-月-日;时-分-秒-毫秒: Log等级,系统做得动作,结果

出0入0汤圆

发表于 2015-3-6 11:07:30 | 显示全部楼层
嵌入式比起桌面应用调试起来还是容易的吧?要理论的话,看下软件工程。实际来讲,就是每写好一个模块都是需要测试的,别等到最后,要不然就会出现楼主的问题:bug根源太难定位。功能性bug还好,像跑飞,可以借助ARM的fault寄存器,几乎都是内存越界或者访问野指针引起的,而且发生错误的地方并不是问题产生的根源。

出0入0汤圆

发表于 2015-3-6 12:28:32 | 显示全部楼层
ccrt 发表于 2015-3-5 08:19
仿真器跑的时候跟程序设计不同,有的时候子程序都不进去,不知道有人遇到类似的情况么?
所以开始就放弃 ...

只要能复现就有办法,最好能找到出问题版本的源码,使用仿真器跟踪,如果确实找不到也可以仿真(前提是你的芯片没有加密),也可以单步,设置断点,只能在汇编下看,观察寄存器,耐心跟踪总能定位问题所在的。

出0入0汤圆

发表于 2015-3-6 12:48:47 来自手机 | 显示全部楼层
一般都是变量初始化问题,数组越界,野指针,堆栈溢出等问题

出0入0汤圆

发表于 2015-3-6 12:53:06 | 显示全部楼层
agilentvee 发表于 2015-3-6 10:47
程序里面每个动作都要记录,同时标记时间,格式如下
年-月-日;时-分-秒-毫秒: Log等级,系统做得动作, ...

有没有个例子参考一下,很简单的,如串口通信等等,硬件出身,网上找了许久也没有看到相关介绍,谢谢啦!

出0入0汤圆

发表于 2015-3-6 15:22:10 | 显示全部楼层
agilentvee 发表于 2015-3-6 10:47
程序里面每个动作都要记录,同时标记时间,格式如下
年-月-日;时-分-秒-毫秒: Log等级,系统做得动作, ...

这个记录通过什么输出或者保存在哪?是开发环境自带的工具还是自己在程序里插入的调试输出接口?

出0入0汤圆

 楼主| 发表于 2015-3-6 21:34:32 | 显示全部楼层
agilentvee 发表于 2015-3-6 10:47
程序里面每个动作都要记录,同时标记时间,格式如下
年-月-日;时-分-秒-毫秒: Log等级,系统做得动作, ...

没有log,从来没有用过,以前都是串口printf的:(
能给详细介绍下log么?一般怎么写,怎么通过log查找或者介绍下资料也行,感谢

出0入0汤圆

 楼主| 发表于 2015-3-6 21:37:34 | 显示全部楼层
zhenghe 发表于 2015-3-6 11:07
嵌入式比起桌面应用调试起来还是容易的吧?要理论的话,看下软件工程。实际来讲,就是每写好一个模块都是需 ...

感觉你说的很有道理啊,尤其是最后一句
实际操作应该如何定位内存越界或者访问野指针这种问题的那?

出0入4汤圆

发表于 2015-3-7 08:18:59 | 显示全部楼层
我们硬件上有这种debug接口专门用来读Log.

出0入0汤圆

发表于 2015-3-7 09:36:00 | 显示全部楼层
跟踪,断点,日志

出0入0汤圆

发表于 2015-3-8 00:57:56 | 显示全部楼层
本帖最后由 crazydtone 于 2015-3-8 01:03 编辑
shell.albert 发表于 2015-3-5 09:25
我一般是大体先定位一下,然后使用
#if 0
#endif


支持此种方法!
几点建议,如下:
1、所定义的函数里面的数组是否越界了;
2、指针的操作,有没有指到其他地方去,将已有的数据重写了;
3、Stack有没有溢出,编译器会提供一些stack检查函数;
你结合自己的实际情况看一下吧

出0入0汤圆

发表于 2015-3-8 04:58:41 | 显示全部楼层
串口输出调试信息,还不行的话,就上仿真

出0入0汤圆

发表于 2015-3-8 10:49:58 | 显示全部楼层
有时候 我会找个空闲的引脚,加个LED  然后把可疑的地方 点灯。

频率高的还有示波器测 抓个波形看看。

当然了串口什么的也都用。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-17 23:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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