dffzh 发表于 2025-4-24 19:29

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

本帖最后由 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的时候,你真的对什么都熟了,包括产品代码框架,协议栈和相关芯片数据手册等,你得到的会很多很多.....



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越多,经验积累越丰富

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

dffzh 发表于 2025-4-25 08:44

丙丁先生 发表于 2025-4-25 05:55
干货满满,是伪代码惹的祸,探案过程引人入胜,作者写得很用心。

亲身经历,感受颇多{:lol:}

大大财迷 发表于 2025-4-25 09:38

楼主,这是什么产品,看着挺高深

dffzh 发表于 2025-4-25 10:21

大大财迷 发表于 2025-4-25 09:38
楼主,这是什么产品,看着挺高深

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

zjk103 发表于 2025-4-25 16:54

处理BUG是熟悉产品最快的途径

dffzh 发表于 2025-4-25 17:21

zjk103 发表于 2025-4-25 16:54
处理BUG是熟悉产品最快的途径

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

xuanhuanzi 发表于 2025-4-25 18:19

是的,解决困难的过程是会提高很多技术积累的。

绝影孤狼 发表于 2025-4-25 18:36

非常赞同楼主的观点,遇到问题不慌不忙,解决问题的过程中能学到很多知识,对产品的理解也会更加深入。

cooldog123pp 发表于 2025-4-26 14:00

非常赞同楼主的观点,遇到问题就是我们成长的开始,工程师都是需要一步一步积累出来的。

破晓战神 发表于 2025-4-26 21:42

非常赞同楼主的观点,解决Bug的过程确实是一个深入了解产品和代码的好机会。通过实际问题,可以更快地掌握相关知识。

dffzh 发表于 2025-4-27 08:59

xuanhuanzi 发表于 2025-4-25 18:19
是的,解决困难的过程是会提高很多技术积累的。

是的,而且印象会更深刻{:handshake:}

dffzh 发表于 2025-4-27 08:59

绝影孤狼 发表于 2025-4-25 18:36
非常赞同楼主的观点,遇到问题不慌不忙,解决问题的过程中能学到很多知识,对产品的理解也会更加深入。
...

确实会比直接理论学习这种方式的效果更好

dffzh 发表于 2025-4-27 09:00

cooldog123pp 发表于 2025-4-26 14:00
非常赞同楼主的观点,遇到问题就是我们成长的开始,工程师都是需要一步一步积累出来的。 ...

看来都是有故事的朋友{:handshake:}

dffzh 发表于 2025-4-27 09:01

破晓战神 发表于 2025-4-26 21:42
非常赞同楼主的观点,解决Bug的过程确实是一个深入了解产品和代码的好机会。通过实际问题,可以更快地掌握 ...

对滴,解决到最后,往往是一个简单的原因导致的Bug,但是整个过程,你可能会涉及到很多方面的知识,包括算法,协议栈,芯片参数和硬件电路等等

单片小菜 发表于 2025-4-27 15:54

PDI中断就执行一次这个函数,为什么只是执行一次呢?

dffzh 发表于 2025-4-27 16:26

单片小菜 发表于 2025-4-27 15:54
PDI中断就执行一次这个函数,为什么只是执行一次呢?

主循环里的调用可以去掉,该函数主要是需要在外部中断里每次中断执行一次

时光贩卖机 发表于 2025-4-28 11:36

非常赞同楼主的观点,遇到问题不慌,解决问题的过程就是最好的学习过程。通过实践,对产品和代码的理解会加深很多。
页: [1] 2
查看完整版本: Bug解决的时候,你对什么都熟了