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 越来越多,总结出一套方法论,前提需对技术原理有正确理解,并且对业务足够熟悉

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

相关推荐
mingshili2 天前
[python] 如何debug python脚本中C++后端的core dump
c++·python·debug
sre运维2 天前
运维人员必备的 Mac Zsh 配置技巧
程序员
陈随易3 天前
anime,超强JS动画库和它的盈利模式
前端·后端·程序员
陈随易3 天前
秦少卫-耗时5个月收入超过北京工资的超级独立开发者
前端·后端·程序员
陈随易4 天前
wangEditor,从开源、停更到重生
前端·后端·程序员
黑心萝卜三条杠4 天前
【Go语言】深入理解Go语言:并发、内存管理和垃圾回收
google·程序员·go
一只爱撸猫的程序猿5 天前
在SpringBoot 项目简单实现一个 Jar 包加密,防止反编译
spring boot·安全·程序员
TF男孩5 天前
独立开发上班后:我的故事,你的酒,一腔沉默往前走
程序员
肖哥弹架构5 天前
ScheduledThreadPool线程池设计/场景案例/性能调优/场景适配(架构篇)
java·后端·程序员
陈随易5 天前
兔小巢收费引发的论坛调研Node和Deno有感
前端·后端·程序员