Debug一些感悟

一、前言

22年底后,团队人员变动后,项目疑难线上问题的跟进解决工作落到我身上,同年承担大型项目的开发,其复杂性以及紧凑的时间线导致QA阶段BUG数量较多。

23年是我的BUG元年,累计解决BUG数量超500个。

在我刚入职XX时,我Leader是个BUG专家,很多时候在描述现象后,能快速定位到BUG根因;

年轻的我十分羡慕这种功力, "Coding五分钟,Debug三小时",Debug效率提升会让你少加很多班,省下的时间可以拿去撩妹,打机,或者去舔你老板拿高绩效。

500个BUG,你已经深入理解你负责的业务系统,同时对代码运行的底层逻辑有抽象整体的感知,这都能很大程度提升Debug效率。

500个BUG,从措手不及,到游刃有余。

二、疑难BUG案例

什么是疑难BUG,定义也许有很多种,但一定有个共性, "无法"复现,展开如下

  • 存在复现路径,但概率复现
  • 存在复现路径,但十分隐蔽,定位后可以稳定复现

这里分享两个疑难BUG案例

2.1 Bluetooth Sco 无限重连干扰通话

简述下背景,项目使用 Agora(声网)构建RTC功能,VIP用户在使用过程出现音频断续问题;问题十分棘手

  • 无法复现
  • Agora技术团队介入排查近一周后没有结论

在完成手头优先级较高的需求后,介入排查,基于用户描述,在关闭蓝牙后,问题消失,以此为切入点,与AgoraTeam协同梳理RTC层蓝牙连接相关日志,发现蓝牙Sco连接在不间断断开重连,因现象无法复现,对此我们提出一些猜想

❌ 猜想一:Samsung SM-S908E(Android 13)系统重复执行startBluetoothSco

日志显示,SCO_UPDATE广播在重复回调 Disconnected → Connecting → Connected,初步确定是重复执行sco连接导致通话异常;且因在通话过程中,用户携带了蓝牙手表等原因,大家的猜想基本一致(但因缺乏复现设备,暂无法验证);

在AgoraTeam提供修复包(监听Disconnected广播并主动stopBluetoothSco)后, 打包验证失败,猜想错误

❌ 猜想二:AgoraSDK 在特定场景下,重复执行 startBluetoothSco

个人经验,(Android)系统往往是稳定的(除非是Beta版本),所以我猜测业务层有重复执行startBluetoothSco的逻辑,但在和AgoraTeam确认后,SDK理论上在joinChannel时执行一次startBluetoothSco,猜想错误

猜想三:SeaTalk 在特定场景下,重复执行 startBluetoothSco

福尔摩斯说过:"当你排除一切不可能的情况,剩下的,不管多难以置信,那都是事实。"

在提出这个猜想后,我们把关注点从RTC层移到了业务层 ,回溯业务日志后,发现(新版本)确实在重复调用startBluetoothSco,在出包委托用户验证后,成功修复

2.2 锁屏状态接听通话异常

背景简述,用户在通话一分钟左右后,音频无法正常传输,一般使用RTC功能,需要开启前台服务保活,我们在正常路径尝试后无法复现,于是提出猜想

❌ 猜想一: 用户对应用开启了电池受限模式,在进入后台后,系统录音服务被暂停

应用默认电池模式是优化状态的,我们在把应用切到受限模式后切到后天进行通话,Samsung-S12可稳定复现

但在与用户联系确认后,却发现应用处于电池优化状态,事情变得棘手了,在猜想无法快速验证且找不到切入点时,我们可以看下日志,把核心路径的链路梳理完毕后,也许你能找到一些线索,细节如下 可以发现用户的异常通话,均是在锁屏状态下收到来电,然后快速锁屏(进入后台),当应用进入后台后,系统暂停了录音服务;根据日志路径成功复现,并提出猜想

❌ 猜想二:特定路径下,系统兼容性问题

控制设备系统变量,相同的路径下低版本无法复现,可确定属于新版本代码引入的问题

猜想三:特定路径下,Service启动失败

锁屏状态下,收到来电,CallService压根没执行,这会导致SeaTalk进入后台时,没有前台服务,系统认定为后台进程,音频采集线程被暂停,猜想成立

2.3 挑战

在接手一些"无法"复现的疑难BUG时,我对相关逻辑完全是零基础的陌生状态,这要求开发

  • 在短时间内快速掌握核心流程逻辑,全面理解上下文,排除干扰因素
  • 再进一步基于问题现象或日志,结合相关技术,确定复现路径,提出猜想,再进行验证

有些问题属于VIP性质,十分紧急,时间压力会比较大,在压力巨大的场景快速解决,能进一步提升研发专业能力。

三、沉淀

Debug三个核心过程,定位(查找根因) -- 梳理(捋清楚上下文)-- 修复(Coding,必要时重构)-- 归因分析(尝试找出优化点,设计避免重犯机制);普通开发往往会忽略"梳理"和"归因分析"这两个步骤,缺乏"梳理",会导致在修复阶段引入其他BUG,缺乏"归因分析",往往会导致在后续迭代过程,出现类似的问题。

量变促进质变,随着解决的线上问题与业务 BUG 越来越多,总结出一套方法论,前提需对技术原理有正确理解,并且对业务足够熟悉

流程节点可细化,类似验证阶段,针对不可复现的问题,需进行模拟验证,进一步保障假设成立

相关推荐
修己xj18 小时前
三月,我只想做好这四件事
程序员
不要秃头啊1 天前
别再谈提效了:AI 时代的开发范式本质变了
前端·后端·程序员
jonjia1 天前
引入新维度化解权衡难题
程序员
jonjia1 天前
优秀的工程师如何打破规则
程序员
jonjia1 天前
在大厂交付大型项目的策略
程序员
jonjia1 天前
RFC 与设计文档
程序员
jonjia1 天前
为什么你(或任何人)应该成为一名研发经理?
程序员
jonjia1 天前
管理技术质量 (Manage Technical Quality)
程序员
jonjia1 天前
大厂软件工程师职业发展路径
程序员
jonjia1 天前
关于工程师与影响力
程序员