您的位置:首页 > 互联网

耗时 3 个月改写一行代码,刚毕业程序员小哥成功消灭潜伏 7 年的 Bug!

发布时间:2024-06-25 15:13:43  来源:互联网     背景:

声明:本文来自于微信公众号CSDN(ID:CSDNnews),作者:苏宓,授权转载发布。

作为脑力工作者,如何评估程序员的个人贡献和价值?不可否认,有些公司依赖代码量、需求完成量等指标来衡量程序员的工作价值。然而,根据 CSDN《2024中国开发者调查报告》数据显示,只有7% 的开发者每天有超过70% 以上的时间在写代码,超过四成的开发者每天编写的代码量集中在100-300行,其余时间不是在开会就是在对需求、Debug。

开发者每天写代码的时间图源:CSDN《2024开发者调查报告》

蔚来汽车一季度销量

那么,这些数据是否足以准确衡量程序员的价值呢?最近,有开发者 ch00f 在讨论论坛 Lemmy.World 发表了一篇题为《花费3个月调查一个7年前的 Bug,并用1行代码修复它》的长文,分享了自己多年前修复 Bug 的一次经历,引发了不少程序员关于生产力、Debug 的讨论。

发现隐藏多年的 Bug

多年前,ch00f 正在为 OG iPad(由苹果公司在2010年发布的第一代iPad)开发一个硬件配件。

这款配件主要是通过 USB 接口连接到iPad,提供 MIDI 输入/输出(Musical Instrument Digital Interface,音乐仪器数字接口,用于电子乐器、计算机和其他相关设备之间的通信和同步)和音频输入/输出,适合音乐家在 Garage Band(一款由苹果公司开发的数字音频工作站软件,主要用于音乐创作和录音)中铺设音轨,录制一些曲目。

这款产品之所以能够获得成功,是因为它的核心是基于公司在为 PC 端制作的一款很常见的 USB 产品,公司在这方面已经有了十多年的技术积累。现如今,只需要基于一个小型的微控制器,就能让 iPad 进入 USB 主机模式(当时 iPad 使用的是30针连接器),然后将其连接到几乎已经完成的产品上,带来了极大的便利。

不过,当时由于这款配件产品已经非常老旧,团队中没有人知道如何重新编写它的程序代码。当需要让它正常与 iPad 连接以及工作时,开发者们不得不直接手动编辑二进制文件,修改 USB 配置描述符,使其能够匹配新开发产品的名称,以便确保 iPad 正确识别和处理这款连接的设备。

此外,ch00f 还要确保他们所开发的固件从 iPad 的 USB 端口获取的电流小于10mA(原来的设备是由端口供电的,但即使是自供电的情况下,iPad如果请求超过10mA 的电流,也会报错)。这一点特别麻烦,因为原始产品的名称只有4个字符,而新产品的名称却有7个字符。ch00f无法为额外的字节腾出空间,所以只能把名字截短,以便将其适配到二进制文件中,同时又不破坏任何功能。

总之,产品出厂面市后,ch00f 及其背后的开发团队发现了这款配件存在一个问题:每隔一段时间,就会丢失一条 MIDI 信息。

对于不太了解的人来说,可能并不懂 MIDI 是什么。稍作解释——MIDI 是用于控制乐器、合成器和其他音乐设备的标准通信协议,它是用来传输音符的,这些音符可以由处理器或音色模块转化为音频。

MIDI 信息包括各种数据类型,用于控制和传输音乐信息,例如:

  • 音符信息,这是最基本和常见的 MIDI 信息类型之一,用于表示音符的开始和结束。每个音符由其音高(例如 A、B、升 F 等)和时长(持续时间)来定义。

  • 力度信息:也称为“音量信息”或“速度信息”,用于指定音符的强弱或键的按压力度。

  • 开键和放键信息:用于表示键盘上的键是按下还是释放。按键被按下时发送“按下”信息,释放时发送“释放”信息。这种信息对于模拟键盘和其他具有类似操作的设备非常重要,以确保正确地模拟音乐家的演奏动作。

从最后一种类型来看,按下和松开键会产生两条不同的信息。

事实上,偶尔丢失一个音符信息一般不会有什么大问题,但对于那些音色具有无限延音的乐器(如管风琴)来说就不同了。如果在使用ch00f 背后公司开发的设备时选择了管风琴音色,它可能会收到“按下”的信息,但不会收到“释放键”的信息。

这样 iPad 就会误以为你无限期地按住琴键。这就导致了声音会一直持续下去,直到你手动停止它。这个问题对于某些乐器音色来说影响很大。

iphone14的通讯模块

苹果汽车上市

小米和广汽集团合作

实际上没有官方规范说明,如果在没有接收到按下键信息的情况下再次接收到相同音符的按键信息该怎么办,但苹果以最糟糕的方式处理了这个问题。iPad 只会在按键开启和释放按键的数量相等时才认为按键被释放。因此,唯一的解决方案就是祈祷和希望它跳过后续的键按下消息,然后最终接收键释放的消息。

然而,发生这种情况的概率几乎为0%,所以大多数用户不得不强制退出应用程序。

针对这个问题,很多消费者在公司留言板上猜测其中原因?有人说是新的 iOS 系统更新导致和这个配件不兼容?也有人称应该关闭其他所有应用程序,再来试试?各种各样的理论铺天盖地,但没人能给出确切的解释。

用 Python 编写脚本,复现 Bug

那时,ch00f是公司的新员工,刚从大学毕业,所以他起初接到的任务就是把这个问题搞清楚。

接下这个需求之后,ch00f第一步是找到产生这个 Bug 的方法。于是,他写了一个 Python 脚本,反复对公司的产品进行音阶测试,并监听是否有按键被卡住。如今回忆过去,ch00f 表示,到现在都还记得那种仿佛一头“发了疯”的大象在键盘上猛砸几个小时的噪音。

最后,ch00f 做到了大概可以每10分钟就能复现一次这个 Bug。他还注意到,这个问题只在同时按下多个键时发生。一次只按一个键不会产生这个问题。

随即,ch00f使用苹果硬件开发人员才能使用的高级电缆,对他们的产品和 iPad 之间的 USB 通信进行了检查。

经过大量的排查(USB 调试器只能采样一小部分数据,所以ch00f必须在听到卡住的音符时按下触发器),ch00f终于发现,释放音键的声音从未传到 iPad 上。所以这撇清了苹果公司的责任,问题就出现在了他们研发的配件没有及时传递 MIDI 信息。

接下来,便是 Debug 的过程了。首先,ch00f 要做的就是让源代码编译起来。在ch00f 的脑海中,他记得依赖于一款“hex3bin”(将十六进制文件转换为二进制文件的工具),和一些 Perl 脚本。

我猜这些工具在七年前写固件时是广泛使用的,但现在需要费点功夫才能找到。我对 Perl 不了解,但我还是让它运行起来了,ch00f 说道。

固件编译好后,ch00f插入一些指令,让特定的 LED 在固件的某些点闪烁(设备内部有几个调试用的 LED,用户看不到)。这个设备的8位处理器没有实时调试器,所以这就是ch00f唯一的调试手段。

问题最终排查出来了,归根结底是一个时序问题。处理器需要处理音频和 MIDI 流量。当处理音频数据包时,它会暂停正在进行的操作。MIDI 流量是缓冲的,所以如果在处理音频时收到按键或放键信息,它会在音频处理完后立即处理。

但它只有一个缓冲区。因此,如果在处理音频时收到第二个 MIDI 信息,第二个音符会覆盖第一个,导致第一个音符永远丢失。通过 USB 传输 MIDI 音符的速度是有限的,但刚好比处理音频的速度稍快。所以如果第一个音符在处理器开始处理音频之后进来,下一个音符可能会在处理器处理完音频之前进来。

解决方案

现在是解决方案。ch00f 表示,虽然其对 USB 音频处理知之甚少,但他在大学时用过8位8051处理器,所以知道哪些函数运行会比较慢。ch00f 用 Ctrl+F 搜索“%”,在音频处理代码中发现了一个16位调制器。

这个16位调制器起到的只是一个最终检查作用,它用来确保发送的字节或位数是正确的(预计余数为零),因此每次的除数是固定的。代码的编写方式让编译器认为每次的除数可能不同,所以它在后台包含了一个完整的函数来处理8位处理器上的16位取模操作。

最终,ch00f在 Google 上搜索了优化取模,很快学到对于固定的除数,任何16位取模都可以重写为三个8位取模。

ch00f尝试实现了这个单行更改,音频处理器的每个数据包处理时间迅速从90微秒降到了20微秒。这个改动100% 解决了这个 bug

为什么存在7年的 Bug 无人识?

不幸的是,固件无法进行现场升级,所以这对客户服务来说仍然是个麻烦。

至于为什么这个 bug 在之前7年的 USB 版本产品销售中从未出现过,ch00f表示,可能是因为大多数用户只将设备用作音频记录器或 MIDI 记录器。如果只启用 MIDI,就不会处理音频,也就不会出现这个 Bug。

然而,iPad 会一直启用所有功能,所以这个 bug 始终存在。只是没有人注意到。另外,许多 MIDI 应用不像苹果公司那样要求按键开/关事件相匹配。因此,如果某个键卡住了,再按一次就能松开。

ch00f 表示,三个月听“魔鬼”在管风琴上砸键盘,最终通过修改一行代码解决了一个七年的 bug。

简而言之:8位处理器上的16位调制解调器速度太慢,导致数据包丢失。

Debug 究竟有多痛苦?

对于 ch00f 的这段经历,也引发了网友的热议。有网友评论道,当你找到解决办法时,公司一定非常满意!干得好!

ch00f 透露称,“事情确实如此。他们告诉我,当天剩下的时间可以休息,这对于我22岁来说,是闻所未闻的。”

Debug 远不及大家想得那么简单,ch00f 的这段经历也让不少开发者们感同身受:

  • 同样,我花了6周时间研究内核令牌环驱动程序间歇性初始化问题。这需要反复重启内核才能观察到问题。断点毫无用处,因为它们掩盖了问题。结果发现在特定步骤中的初始化不是同步的,读取状态是一个竞赛条件。我们花了几个星期的时间盯着看,开着玩笑,思考,胡思乱想,然后突然,瞧。改变代码顺序,成功了。

  • 在错过了多个 deadline 后,我多次用头撞到桌子上,然后突然有了一个清醒的头脑,比如“这给了我 X 的感觉,但如果真的如此,那就太疯狂了”,然后我快速进行字符串搜索,问题真的就出现了。

也有人认为:

  • 你必须承认,这种情况并不常见。如果一个开发人员经常要花3个月的时间来修复每一个 bug,那么这些 bug 最好都是令人讨厌的异生兽,因为开发人员更有可能只是速度太慢。

  • 我可以想象,几乎所有的开发经理都会在发现 Bug 的第2周或第1个月后说,这个问题的优先级不够高,不需要投入这么多时间。

  • 解决 Bug 的挑战有一半不是修复代码,而是发现到底发生了什么。

那么,你在 Debug 过程中又发生哪些难忘的事情,欢迎分享。

来源:

https://news.ycombinator.com/item?id=40749624

https://lemmy.world/post/16763534


返回网站首页

本文评论
自助取票机显示无购票信息「APP显示无票 但车站自助售票机有余票 12306回应」
快科技2月6日消息,据中国铁路官微消息,当前正值2024年春运高峰期,近日,有网友反映在线上渠道购买火车票显示没有余票,但在自助售票机上却显示有余票”对此,铁路 12306 技术负责人...
日期:02-06
买个电纸书,怎么老被“拔网线”?「电脑网线被家长拔走了怎么办?」
声明:本文来自于微信公众号 盒饭财经(ID:daxiongfan),作者:毕安娣,授权转载发布。又一个电纸书产品不干了,近期,QQ阅读电子书设备/口袋阅(以下简称“口袋阅”)宣布停运。在只有4778个成...
日期:10-03
怎么理解私域流量「可别再用私域流量解释一切了」
声明:本文来自于微信公众号 甲方财经(ID:jiafangcaijing2019),作者:井寻,授权转载发布。别再用“私域流量”解释一切了当"私域流量"这个概念最早被提出的时候,其实从来没有被真正...
日期:12-21
互联网数据分析机构comScore遭遇隐私侵权诉讼
  北京时间8月24日早间消息,美国互联网数据分析机构comScore周二在芝加哥一家联邦法院遭遇了隐私侵权诉讼。原告方称,comScore窃取了用户的机密信息,包括密码、信用卡号码和...
日期:07-22
刘强东拟出售价值约2790万美元京东股票_刘强东在京东占股
6月29日 消息:根据京东提交的SEC文件(144表格)显示,京东集团董事长刘强东拟通过关联公司Fortune Rising,出售80万份ADS(1ADS=2普通股),按文件公开前一天的收盘价估算,这批股票价值...
日期:06-29
美股周三:三大股指均涨超1%,特斯拉涨逾4%,阿里涨超2%「美股三大指数齐收涨」
5月18日消息,美国时间周三,美股收盘主要股指全线上涨,涨幅均超1%。投资者期待白宫与国会的谈判代表将打破美国债务上限谈判的僵局,以避免前所未有的债务违约。道琼斯指数收于334...
日期:05-18
华为c8500软件下载
华为c8500是一款古老的智能手机,但目前还有少数人仍在使用。因此,如何下载华为c8500的软件成为了一些用户的需求。本文将为大家介绍的相关信息。京东黑五是正品吗首先,应该注意...
日期:05-29
马斯克发文让特斯拉市值蒸发140亿「马斯克在 2018 年私有化特斯拉推文的官司中胜诉」
IT之家 2 月 4 日消息,据路透社报道,美国陪审团周五裁定特斯拉首席执行官埃隆・马斯克(Elon Musk)及其公司不对误导投资者承担责任。此前,马斯克在 2018 年发推文称他已为公司私...
日期:02-04
魏牌高山MPV成都车展开启预定 「家庭出行头等舱」_魏山巍 高瓴
【】8月25日消息,在本届成都车展上,魏牌旗下首款新能源高端MPV车型高山正式开启预定,不过并没有公布具体价格区间,目前预订的用户可享受包括“1000元订金享10000元礼遇”在内的...
日期:09-16
全民玩飘移!4399游戏盒《跑跑卡丁车》尽兴玩_4399完美漂移赛车图片
  4399游戏盒《跑跑卡丁车》是一款休闲类的赛车竞速游戏。与其他竞速游戏不同的是,跑跑卡丁车首次在游戏中添加了漂移键,即是说玩家们在这个网络游戏中也能亲身感受下“全...
日期:07-23
家长带娃博物院内随地小便 视频让网友吵翻太没素质:故宫回应了
公共场所让孩子直接小便,这素质确实不能说高,至少家长是这样的。野生大黄鱼的做法7月6日,一位家长带着孩子在故宫博物院内随地小便的视频在网络流传。画面显示,一名小男孩在角落...
日期:07-07
将规模化扩展AI能力,高通和微软达成合作_高通 ai
高通中国发布消息称,高通和微软确认达成合作关系,将面向消费级和企业级终端、以及工业设备,规模化扩展AI能力。高通表示,未来几个月内,包括大语言模型(LLM)在内的参数高达100亿的模...
日期:09-27
森海塞尔 recharge has set「森海塞尔EW-DP SKP直插式发射机即将到货 促销活动火热开启」
北京,2024年4月26日——森海塞尔EW-DP SKP直插式发射机,自去年年底问世以来,便倍受广大用户期待。现在,在中国大陆地区,这款万众瞩目的产品即将到货。即日起至5月31日,配套促销活...
日期:04-26
三星2022年「未来显示生而不凡:2023三星MICRO LED技术品鉴会正式登“鹭”」
7月15日,全球首次三星MICROLED技术品鉴会在厦门举办,展示89英寸级、110英寸级家用MICROLED以及三星TheWallIWA商用显示器,探讨MICROLED背后的创新技术理念与最新的市场需求。在...
日期:07-17
微念李子柒发公告:双方和解_微念与李子柒
今日消息,微念发布公告称,微念与李子柒在绵阳市中级人民法院的调解下,双方达成和解。印度上半年智能手机出货量同比公开报道显示,李子柒和微念曾是合作伙伴。2021年10月,子柒文化...
日期:12-27
大盘暴跌个股尾盘拉升_中概股周二收盘多数下跌 法拉第未来跌近17% 斗鱼跌超7%
布加迪手表16缸   北京时间17日凌晨,美股周二收盘涨跌不一。投资者正在评估两家大型零售商的财报。沃尔玛的业绩超预期,重申未来业绩指引。市场还在等待周三的美联储会议纪...
日期:08-18
刚刚公布,余额宝第一大户持有金额下降超2000万元,年赚500万不再_余额宝放500万
什么都不干,一年躺赚500万元,你能想象吗?这是一位余额宝投资者三年前的年收入。不过,随着天弘余额宝收益率越来越低,余额宝的第一大户也开始动了,最新持有金额约为2亿元,下降超200...
日期:09-13
刘韵洁:从“尽力而为”向“确保所需”,确定性网络大有可为
通信世界网消息(CWW)当前,网络信息技术日益成为创新驱动发展的先导力量,深刻影响着国家发展与社会变革。近日,中国工程院院士、紫金山实验室主任刘韵洁接受了人民网专访并就未来...
日期:09-25
光缆年度销量排名行业「国家统计局:我国上半年光缆产量累计值达1.66亿芯千米」
通信世界网消息(CWW)据国家统计局数据,2023年上半年,我国光缆产量累计值达到1.66亿芯千米,与去年同期相当。光纤作为光通信技术的基石,几乎所有的光传输技术都需要将光纤作为传输...
日期:07-25
一加7pro迈凯伦限定版区别_超跑风范 一加7T Pro迈凯伦限定版媒体评价出炉
  近日,一加7T Pro迈凯伦限定版在一加官网及京东商城火热开售。10月15日,一加手机发布了一加7T系列新品,并在发布会上推出了与迈凯伦深度合作的一加7T Pro迈凯伦定制版。...
日期:10-17