深入探究一个长期隐藏的底层bug的学习报告

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 在软件开发的过程中,底层bug往往像一颗定时炸弹,随时可能引发严重的问题。本文将分享我在开发过程中遇到的一个长期未被发现的底层bug,以及我如何逐步排查并最终解决这个问题的全过程。通过这次排查,我深刻认识到了代码规范性的重要性。一个不规范的代码修改,虽然短期内可能不会引起问题,但长期累积下来,可能会引发灾难性的后果。此外,我也意识到了底层模块的通用性和风险意识的重要性。在解决一个问题的同时,应该审视是否有相似的问题存在,以避免未来的风险。

引言

在软件开发的过程中,底层bug往往像一颗定时炸弹,随时可能引发严重的问题。本文将分享我在开发过程中遇到的一个长期未被发现的底层bug,以及我如何逐步排查并最终解决这个问题的全过程。

背景

我所在的项目组负责开发一款App客户端,该App主要功能是对店铺招牌进行拍摄。项目历史悠久,最近出现了一个棘手的问题:用户在拍摄照片时,有一定概率出现照片损坏的情况。这个问题在线上环境已经存在一段时间,但由于缺乏深入的排查,其根本原因一直未被明确。

问题现象

经过初步的自测和了解,我明确了以下几个现象:

  1. 现象1:不同任务类型都有此问题,表明出错范围在底层拍照存储模块。
  2. 现象2:大约每拍摄200张照片就会出现一张损坏的图片,这个bug出现频率异常稳定。
  3. 现象3:仅在webp格式的图片中出现此问题,而jpeg格式则无此现象。

排查过程

1. 摄像头和图片格式问题排查

首先,我怀疑问题可能出在摄像头生成webp图片的过程中。但经过测试,损坏的加密图片对应的原始webp照片都是可以正常展示的,因此排除了手机摄像头和压制webp图片的问题。

2. 加密流程问题排查

接下来,我将排查重点放在了加密算法上。通过对AES加密算法的深入了解,我确认了算法本身的健壮性。然而,在审查加密解密流程时,我发现了一个严重的逻辑问题:预览图片时,图片会被解密并显示,然后再次被加密写回磁盘,这一过程不仅效率低下,而且极易导致文件损坏。

3. 线程安全和锁竞争问题排查

在排查线程安全问题时,我通过实现一个简单的加解密算法来模拟耗时操作,并发现无论怎么调整耗时,都没有出现图片损坏的情况。这让我坚信加密算法本身是没有问题的。

4. 图片处理问题排查

通过对损坏图片的深入分析,我发现问题可能出现在解密算法上。在服务端同事的帮助下,我替换了端上的解密算法,损坏的图片得以正确展示。

5. 解密算法问题排查

最终,我发现问题出在解密算法的一处逻辑上:在处理二进制图片时,算法错误地将图片的第一个字节(为0x00)解释为空字符串,导致解密失败。修改了这一逻辑后,问题得到了解决。

总结

通过这次排查,我深刻认识到了代码规范性的重要性。一个不规范的代码修改,虽然短期内可能不会引起问题,但长期累积下来,可能会引发灾难性的后果。此外,我也意识到了底层模块的通用性和风险意识的重要性。在解决一个问题的同时,应该审视是否有相似的问题存在,以避免未来的风险。

这次经历不仅提升了我的技术能力,也加深了我对软件开发流程的理解。在未来的工作中,我将更加注重代码的规范性和安全性,以防止类似问题的发生。

本文的分享对于其他开发者在遇到类似问题时具有参考价值。它提供了一种系统的排查方法,从现象分析到问题定位,再到解决方案的实施,整个过程逻辑清晰,可操作性强。同时,本文也强调了代码规范和风险意识的重要性,对于提升开发者的整体开发素养具有积极意义。

目录
相关文章
|
6月前
|
设计模式 算法 程序员
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
作为开发者,我们在日常开发过程中,往往会遇到反复修改bug的情况,而且不能一次性把代码写的完美无瑕,其实开发项目是一项复杂而富有挑战性的任务,即使经验丰富的程序员也难以在一次性编写完美无瑕地完成代码,我个人觉得一次性写好代码是不可能完成的事情。虽然在设计之初已经尽力思考全面,并在实际操作中力求精确,但程序员仍然需要花费大量时间和精力来调试和修复Bug。那么本文就来分享程序员需要反复修改Bug的原因,以及在开发中所面临的复杂性与挑战。
170 1
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
|
30天前
|
机器学习/深度学习 敏捷开发 算法
技术之道:从细节到全局的智慧
【10月更文挑战第12天】 本文将分享一些关于技术感悟的心得,通过具体实例和总结,探讨如何从细节出发,逐步提升技术能力。无论是新手还是资深开发者,都能从中得到启发和指导。
38 1
|
3月前
|
自然语言处理 前端开发 JavaScript
前端进阶必读:JS闭包深度解析,掌握这一特性,你的代码将焕然一新!
【8月更文挑战第23天】闭包是JavaScript的一项高级功能,让函数能够访问和操作外部函数作用域中的变量。本文深入解析闭包概念、组成及应用场景。闭包由函数及其词法环境构成,通过在一个函数内定义另一个函数来创建。它有助于封装私有变量、维持状态和动态生成函数。然而,不当使用闭包可能导致内存泄漏或性能问题。掌握闭包对于实现模块化代码和成为优秀前端开发者至关重要。
40 0
|
6月前
|
存储 Web App开发 运维
发布、部署,傻傻分不清楚?从概念到实际场景,再到工具应用,一篇文章让你彻底搞清楚
部署和发布是软件工程中经常互换使用的两个术语,甚至感觉是等价的。然而,它们是不同的! • 部署是将软件从一个受控环境转移到另一个受控环境,它的目的是将软件从开发状态转化为生产状态,使得软件可以为用户提供服务。 • 发布是将软件推向用户的过程,应用程序需要多次更新、安全补丁和代码更改,跨平台和环境部署需要对版本进行适当的管理,有一定的计划性和管控因素。
1481 1
|
设计模式
重构·改善既有代码的设计.04之重构手法(下)完结
重构改善既有代码的设计完结篇,汇总了全部的重构手法。看看哪些手法对你的项目能有所帮助…
7407 2
重构·改善既有代码的设计.04之重构手法(下)完结
|
自然语言处理 API Python
除庄周梦蝶外,庄子还讲过哪些梦你知道吗?新故事引出新版本——
除庄周梦蝶外,庄子还讲过哪些梦你知道吗?新故事引出新版本——
177 0
|
算法 Oracle Java
深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的"标准参数"的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」
深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的"标准参数"的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」
136 0
|
编译器 C++
C | 一种需要特别留心的编程错误(++i) + (++i) + (++i)
诸如此类的表达式`(++i) + (++i) + (++i)`,很多学校都喜欢用在学生的期末考里,看似经典的考题,有没有可能本身就是错误的呢?这种错误并不是语法错误,是可以正常运行的,这就造成了“==它是正确的编程==”这种假象
117 0
C | 一种需要特别留心的编程错误(++i) + (++i) + (++i)
相亲软件开发,关注应用启动优化的本质
相亲软件开发,关注应用启动优化的本质
|
存储 Python
热饭的测开成果盘点第二十二期:wqrfnium自动维护库
本期介绍的是一个组件,身为python的第三方库,已经被pypi收录,且国内镜像源也早已复制。也就是说可以通过pip install 来下载。这个组件包括:wqrfnium 和 wqrfnium_app 。他们都是基于python/selenium/appium的一个可以自动维护ui元素,抵抗ui元素定位变化的组件。
热饭的测开成果盘点第二十二期:wqrfnium自动维护库