记一次BUG分析

前言

不知道如何归类,类似if(); 所谓"粗心"导致的
这个错误是因为使用平台配置代码,需要配置的信息太多,部分配置出现错误。(平台配置后会自动修改某个宏定义的值)
现象:某个故障在掉电后不再被记录,而其他故障没有这个问题

排查方案

  1. 了解函数调用的整个过程,不断调试找到逻辑错误
  2. 对比其他的故障,发现其逻辑的不同

方案对比

方案1:作为刚刚入职的菜鸟,想要了解每个函数的作用,是一个非常困难的过程,如果确实能了解到整个系统架构,我认为也是一个不错的学习过程,但我认为不能迅速解决问题。对于开发时间短的,很有可能最终无功而返。

方案2

Q: 如何对比,如果是自己的项目,我会为每个函数都设置断点,对比函数调用过程。但是公司项目使用vscode函数跳转可能不够完全,想为每个函数都进行日志打印有难度。

A: 这个时候我联想到gdb下的堆栈调用,可以很好的知道对应的函数调用。


Q:这个项目无法使用gdb调试,只有专属的MULTI调试器

A: 稍微现代一点的调试器都应该具有想gdb那样的功能,最终还真被我找到了,而且这个工具还支持将调用转为pdf文件


至此,我幻想到对应的bug通过对比已经解决了


实践发现堆栈调用无法查看函数调用,只能展示,而且有些函数无法设置断点(怀疑被内联了)

尝试方案:
首先找到为什么无法设置断点

  1. 随机分法:在对应的调用过程中随机设置几个断点,查看对应的参数是否发生改变
  2. 寻找是否有其他的方案代替,比如工具是否支持完整的函数调用show

查找发现确实是内联,而且是通过宏定义

#ifndef LOCAL_INLINE
  #define LOCAL_INLINE  static inline
#endif

为了方便调试,修改该宏定义(注意要修改回来)


** 最终找到了问题所在**

反思

对应的位置已经不属于自己负责开发的部分,而是通过配置文件自动生成的。
那么对比的应该是正确的配置文件和错误的配置文件差别来查找问题。(可以有效提高效率)

posted @ 2024-08-09 18:32  daligh  阅读(8)  评论(0)    收藏  举报