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的时候,你真的对什么都熟了,包括产品代码框架,协议栈和相关芯片数据手册等,你得到的会很多很多.....
解决的bug越多,经验积累越丰富 干货满满,是伪代码惹的祸,探案过程引人入胜,作者写得很用心。 chenqianqian 发表于 2025-4-24 21:28
解决的bug越多,经验积累越丰富
是的,遇到的坑多了,就慢慢学会防患于未然了 丙丁先生 发表于 2025-4-25 05:55
干货满满,是伪代码惹的祸,探案过程引人入胜,作者写得很用心。
亲身经历,感受颇多{:lol:} 楼主,这是什么产品,看着挺高深 大大财迷 发表于 2025-4-25 09:38
楼主,这是什么产品,看着挺高深
EtherCAT总线的从站模块,用在工业自动化领域的。 处理BUG是熟悉产品最快的途径 zjk103 发表于 2025-4-25 16:54
处理BUG是熟悉产品最快的途径
是的, 阁下有什么印象深刻的Bug经历,分享一下 是的,解决困难的过程是会提高很多技术积累的。 非常赞同楼主的观点,遇到问题不慌不忙,解决问题的过程中能学到很多知识,对产品的理解也会更加深入。
非常赞同楼主的观点,遇到问题就是我们成长的开始,工程师都是需要一步一步积累出来的。 非常赞同楼主的观点,解决Bug的过程确实是一个深入了解产品和代码的好机会。通过实际问题,可以更快地掌握相关知识。
xuanhuanzi 发表于 2025-4-25 18:19
是的,解决困难的过程是会提高很多技术积累的。
是的,而且印象会更深刻{:handshake:} 绝影孤狼 发表于 2025-4-25 18:36
非常赞同楼主的观点,遇到问题不慌不忙,解决问题的过程中能学到很多知识,对产品的理解也会更加深入。
...
确实会比直接理论学习这种方式的效果更好 cooldog123pp 发表于 2025-4-26 14:00
非常赞同楼主的观点,遇到问题就是我们成长的开始,工程师都是需要一步一步积累出来的。 ...
看来都是有故事的朋友{:handshake:} 破晓战神 发表于 2025-4-26 21:42
非常赞同楼主的观点,解决Bug的过程确实是一个深入了解产品和代码的好机会。通过实际问题,可以更快地掌握 ...
对滴,解决到最后,往往是一个简单的原因导致的Bug,但是整个过程,你可能会涉及到很多方面的知识,包括算法,协议栈,芯片参数和硬件电路等等 PDI中断就执行一次这个函数,为什么只是执行一次呢? 单片小菜 发表于 2025-4-27 15:54
PDI中断就执行一次这个函数,为什么只是执行一次呢?
主循环里的调用可以去掉,该函数主要是需要在外部中断里每次中断执行一次 非常赞同楼主的观点,遇到问题不慌,解决问题的过程就是最好的学习过程。通过实践,对产品和代码的理解会加深很多。
页:
[1]
2