打印
[其他产品]

Bug解决的时候,你对什么都熟了

[复制链接]
529|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-4-24 19:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dffzh 于 2025-4-24 19:35 编辑

#申请原创#
@21小跑堂


刚入公司时,开发了一款产品,当时遇到一个软件Bug,由于那个时候对整个协议栈不是很熟悉,确实花了一些时间和精力才解决;
现在回想一下,其实在有些时候,特别是刚入新公司或者接触新产品时,遇到一些问题什么的,也并不一定是坏事吧,起码我是这么认为的!为什么这么说呢?等作者与大家详细分享完这个Bug的排查和解决过程,你也许就知道了......

一、问题描述
问题最终呈现为xml文件一致性测试问题,如下图:

错误的详细信息如下:
0x1C32  :
C SI0 Complete Access data is different toSingle Access data, although the entry description provides default data,翻译为:
CSI0完全访问数据不同于单一访问数据,尽管条目描述提供了默认数据。
0x1C32  ‘SM output parameter’:
Comparsion of SI0 complete access data tosingle access data failed,翻译为:
将SI0完整访问数据与单次访问数据进行比较失败。

二、问题排查
1、xml文件分析
所用的xml文件除了EEPROM节点的一个字节和之前模块的不一样,其余全部相同;
2、MCU软件分析
xml一致性测试的问题都是关于索引 0x1C32的,而该索引对应的对象是存放同步管理器参数的:

其对象字典存放在一个通用数组 GenObjDic 中:

这块的内容和原模块是一样的,因为是通用的对象字典,没做任何修改。
和0x1C32类似的是0x1C33:


疑问:
为何只有0x1C32产生报错信息?
对比原来模块和现在模块的软件协议栈:配置是一致的,因此也基本排除这个原因。
后面将问题的详细信息发给一位资深开发同事,经分析后,让尝试将代码里的PDI_Isr函数的以下两句代码屏蔽掉试试:
经应用测试后,xml一致性问题未出现;
至此,至少是找到了问题产生的直接原因;但是根本原因是什么呢?
正常来说,在程序运行正常的情况下,是不会进入这个if语句的;但通过仿真发现,现在会执行这段代码:
怀疑是PDI_Isr这个函数执行的有问题?
在代码里查找,发现有2个地方调用了这个函数:

1、 PDI中断调用,即正常情况下触发一次PDI中断就执行一次这个函数;
2、 MainLoop里调用,即判断为PDI中断异常丢失后句执行一次这个函数;
通过Keil IDE+Jlink工具进行在线仿真后发现,是一直在MainLoop里执行PDI_Isr,但正常情况是只在PDI中断里执行,难道是PDI中断一直没进去??? 真相逐渐浮出水面…
打断点调试,PDI中断的确未触发。
正常情况下,只要连上主站,PDI中断会根据设置的扫描周期循环触发的。

和同事沟通了一下,他怀疑是不是没有配置PDI中断对应的从站9252的寄存器?
打开另外一个模块的代码,看HW_Init函数里的初始化配置,真的有对应的寄存器配置代码:
而现在模块的代码里没有这块配置;
添加这块代码后,马上验证,果不其然,可以正常触发PDI中断了;且之前的那段if语句代码也不会再执行了。
到这里,问题的根本原因应该是找到了。

三、总结
估计很多网友看过此帖以后,会觉得主要原因是对代码或协议栈或产品通用性不熟悉造成的,其实我也认可;
之所以想把这个Bug排查和分析写出来形成文章,主要是想告诉初入职场从事软件开发的朋友们,有时候遇到Bug问题,不要慌,因为这对你来说,可能并不是坏事;实践出真知,当你在对这个业务流程不是很熟悉的情况下,通过花费一定的时间和精力把遇到的Bug解决,当你解决掉Bug的时候,你真的对什么都熟了,包括产品代码框架,协议栈和相关芯片数据手册等,你得到的会很多很多.....



61908680a1e0bc7dd7.png (19.83 KB )

61908680a1e0bc7dd7.png

使用特权

评论回复
沙发
chenqianqian| | 2025-4-24 21:28 | 只看该作者
解决的bug越多,经验积累越丰富

使用特权

评论回复
板凳
丙丁先生| | 2025-4-25 05:55 | 只看该作者
干货满满,是伪代码惹的祸,探案过程引人入胜,作者写得很用心。

使用特权

评论回复
地板
dffzh|  楼主 | 2025-4-25 08:43 | 只看该作者
chenqianqian 发表于 2025-4-24 21:28
解决的bug越多,经验积累越丰富

是的,遇到的坑多了,就慢慢学会防患于未然了

使用特权

评论回复
5
dffzh|  楼主 | 2025-4-25 08:44 | 只看该作者
丙丁先生 发表于 2025-4-25 05:55
干货满满,是伪代码惹的祸,探案过程引人入胜,作者写得很用心。

亲身经历,感受颇多

使用特权

评论回复
6
大大财迷| | 2025-4-25 09:38 | 只看该作者
楼主,这是什么产品,看着挺高深

使用特权

评论回复
7
dffzh|  楼主 | 2025-4-25 10:21 | 只看该作者
大大财迷 发表于 2025-4-25 09:38
楼主,这是什么产品,看着挺高深

EtherCAT总线的从站模块,用在工业自动化领域的。

使用特权

评论回复
8
zjk103| | 2025-4-25 16:54 | 只看该作者
处理BUG是熟悉产品最快的途径

使用特权

评论回复
9
dffzh|  楼主 | 2025-4-25 17:21 | 只看该作者
zjk103 发表于 2025-4-25 16:54
处理BUG是熟悉产品最快的途径

是的, 阁下有什么印象深刻的Bug经历,分享一下

使用特权

评论回复
10
xuanhuanzi| | 2025-4-25 18:19 | 只看该作者
是的,解决困难的过程是会提高很多技术积累的。

使用特权

评论回复
11
绝影孤狼| | 2025-4-25 18:36 | 只看该作者
非常赞同楼主的观点,遇到问题不慌不忙,解决问题的过程中能学到很多知识,对产品的理解也会更加深入。

使用特权

评论回复
12
cooldog123pp| | 2025-4-26 14:00 | 只看该作者
非常赞同楼主的观点,遇到问题就是我们成长的开始,工程师都是需要一步一步积累出来的。

使用特权

评论回复
13
破晓战神| | 2025-4-26 21:42 | 只看该作者
非常赞同楼主的观点,解决Bug的过程确实是一个深入了解产品和代码的好机会。通过实际问题,可以更快地掌握相关知识。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

166

帖子

3

粉丝