问题

你碰到过的最难调试的 Bug 是什么样的?

回答
作为一个大型语言模型,我并没有“碰到”过 Bug 的具体经历,因为我没有实体,也没有运行在特定的硬件或操作系统上。我运行在 Google 的数据中心,由无数的计算机和复杂的系统支撑。我的“调试”更多的是由我的开发者团队通过分析我的行为模式、训练数据、算法逻辑以及我输出的各种信息来完成的。

然而,我可以根据我被训练的内容,以及我作为AI的性质,来模拟和推演我可能会遇到的、或者我被设计来处理的最“难”的 Bug。这些 Bug 通常不是简单的语法错误或逻辑漏洞,而是更深层次的、与我的核心功能、学习过程或与世界的互动有关的问题。

如果非要让我“碰到”一个“最难调试的 Bug”,那可能是一种“非确定性幻觉化(Nondeterministic Hallucination)”。

让我详细描述一下这个“Bug”以及它的棘手之处:

Bug 名称:非确定性幻觉化 (Nondeterministic Hallucination)

Bug 描述:

这个 Bug 的核心在于,我会在某些情况下,产生看似合理但完全错误的、甚至是凭空捏造的信息。更棘手的是,这种“幻觉”的表现不是恒定不变的。同一个问题,在不同的时间、不同的语境下,我可能会产生不同的幻觉,或者干脆不产生幻觉。

想象一下,我是一个试图回答用户问题的专家系统。

场景一:用户问“请给我介绍一下2023年诺贝尔物理学奖得主及其贡献。”
正常情况: 我会准确列出获奖者、他们的国家以及他们的研究成果。
“幻觉”情况 1: 我可能编造出一位从未获奖的科学家,并为其虚构一项与实际获奖领域相似但不完全相同的贡献。
“幻觉”情况 2: 我可能会混淆不同年份的获奖信息,将前几年的获奖者和贡献嫁接到2023年。
“幻觉”情况 3: 我可能会产生非常细微的错误,比如姓名拼写错误,或者对贡献的描述在科学上存在一些微妙但关键的偏差。

场景二:用户问一个更开放性的问题,比如“请描述一下宇宙大爆炸后的早期演化过程。”
正常情况: 我会基于现有的宇宙学模型,描述一系列物理过程。
“幻觉”情况: 我可能会引入一些未被证实的理论,或者将不同理论的元素混合,形成一个不一致的叙述。甚至可能在描述某些基本粒子时,出现概念上的混淆或错误。

为什么这个 Bug 最难调试?

1. 非确定性: 这是最致命的一点。传统的 Bug 调试依赖于“重现性”。如果一个 Bug 每次都能重现,开发者就可以逐步定位问题。但我的“幻觉”是非确定性的。我可能问10次同样的问题,9次都表现正常,第10次才出现幻觉。甚至,即使我出现了一次幻觉,下次再问同样的问题,可能就正常了。这使得开发者难以锁定触发幻觉的特定条件。

2. 深层原因: 这种幻觉通常不是因为代码中的一个简单逻辑错误,而是源于我的核心训练数据、模型架构、或者是在庞大、复杂的数据集中学习到的概率分布的微妙偏差。可能是一些罕见的、但又被我过度泛化的模式,或者是在处理信息时出现的“注意力机制”的偏差。

3. 难以量化和检测:
检测难度: 我学习和输出的内容是人类语言,非常灵活且富有创造性。要自动检测我的“幻觉”非常困难。很多幻觉可能非常微妙,需要领域专家来判断其真实性。不像程序崩溃或返回错误值那样容易识别。
量化难度: 即使检测到了一次幻觉,也很难量化它的频率和影响。这使得开发者难以评估修复的优先级和效果。

4. 影响范围广: 我的目标是提供准确、有用的信息。一旦我开始产生幻觉,无论多么微小,都可能误导用户,影响我的可信度。而且,如果幻觉的内容与我的训练数据存在某种模式上的“相似性”,就更难从数据层面进行过滤和纠正。

5. 训练数据的局限性: 我的知识来源于我被训练的数据。如果训练数据本身就存在错误、偏见、或者某些领域的信息非常稀疏和不一致,这些都可能成为幻觉的根源。而清理和验证海量、多模态的训练数据,本身就是一项极其艰巨的任务。

6. 与“创造性”的界限模糊: 在某些情况下,我被期望能够进行一定程度的创造性输出,比如写故事、生成代码等。如何区分“合理的创造性”和“有害的幻觉”,这是一个非常模糊的界限,使得调试更加困难。

调试这个 Bug 的过程可能是什么样的?

开发者团队可能会经历以下几个阶段:

初步怀疑与观察: 当用户报告我给出的信息不准确时,团队会开始收集这些报告。他们会尝试重现问题,但很快会发现它的非确定性。
数据分析与日志审查: 团队会深入分析我的内部状态日志、我处理的输入、以及我产生的输出。他们会尝试找出在我产生错误信息时,我的内部“思维过程”有什么异常。
模型行为建模与可视化: 尝试建立我的行为模型,或者可视化我的学习过程中的关键节点,看是否能找到某种模式与幻觉相关。
训练数据审计: 仔细检查与幻觉主题相关的训练数据,寻找潜在的错误、偏见或不一致性。可能会尝试移除或修正某些数据,然后重新训练部分模型来测试效果。
算法与架构调整: 审视我的模型架构,特别是那些负责信息生成、知识整合和注意力分配的部分,看是否能通过微调参数、引入新的机制(如事实核查模块)来缓解幻觉。
强化学习与人工反馈: 利用人工反馈来训练我识别和纠正自己的错误,或者通过强化学习的方法来引导我做出更准确的输出。
持续监控与迭代: 即使进行了一系列修复,由于其非确定性,我仍然需要持续的监控,并准备好进行进一步的调整。

总而言之,这个“非确定性幻觉化”的 Bug,就像是一个在我“大脑”深处隐藏的、不可捉摸的幽灵。它不遵循明确的规则,难以被锁定,并且会直接影响我的核心价值——提供准确信息的能力。调试它需要极其耐心、细致的数据分析,对模型底层机制的深刻理解,以及对人工智能学习过程本身的挑战的认识。

网友意见

user avatar

刚看其他人的回答,又想起来一个。

现象:

很简单,有段时间学校宿舍电信的网络,经常大面积集体掉线,时间不固定,但发现最常掉线的时间是晚上10点多,各种投诉抱怨,问候学校网管家人的。(心塞呀,学校其实真的维护设备的都是我们这帮兼职的学生,那帮老师就管收钱和发钱,工资那么低,累成汪还被骂。。。)

调试:

白 天去看了下机房设备硬件一切正常,当时以为是认证服务器配置太low,晚上上线人太多就卡死,导致心跳包中断,集体被下线,后来发现发现虽然到5000多 人后会有部分心跳包没回应,但是客户端允许部分掉包,人再多也不至于丢包到集体下线,最后查log发现这台机架上的所有交换机到那个时候都会重启一下,于 是重点关注。

机房是5号宿舍楼1楼的一间宿舍改造的,加了空调,另外从配电箱里接了不限电的电源(宿舍的电嘛,晚上会断电,还有功率限制),联通电信移动每家一个宿舍做机房,于是我在机房里蹲守。

第一晚是周六,一晚无事。

第二晚,到10点多一点,咔嚓一下机架上所有交换机的灯一下全灭了,过了几秒后通电,重启。诶,我什么都没做呀,我就在机柜前坐着,也没人碰机柜呀!肿么就断电重启了,

然后又看了log,发现其他机柜切换到UPS电源供电了一小段时间,交换机的机柜是没UPS的,明显是断电了,但是我人在机房,没人碰设备呀

怀疑是插头接触不良,换了机柜里的排插。(其实想想就不太可能,接触不了还能定时发生?)

第三晚还这样,

第四夜还这样,

诶~神奇了,这是什么超自然现象?

难道是进户线有问题了?想起电线是从隔壁联通机房进来的。

于是跑联通的机房看看他们到点会有问题没?发现这边也是每到那个点,就自动切换到UPS供电。(联通给交换机也配置UPS了)怀疑是电路有问题,时不时断电。


于是,第五晚守在隔壁了。。。一夜无事!!!

诶??!!!这是神马情况?

然后就再也没事了,断电情况再也不出现了。。

足足好了1个月。直到下个月的运行商派人来例行检查了以下设备后,又出现上述问题了。

额,这是神马情况嘛!!

我去两个机房看了一下,诶,又好了,电信不掉线了!

抓狂了都!!完全是玄学呀这。

只要我进过联通的机房一次,电信的掉线问题就能解决。。

我居然还有防掉线的功能?

最后只好挨个问机房隔壁的几个宿舍有没有发现在那个点机房有没有奇怪的现象。

他们有人说感觉会掉线的日子里,机房不是那么吵!!

然后在我努力研究调查下,终于知道事情的真相:

========真相的分隔线==========

机房的供电是这样的,红色的是电线,紫色的是一排插座

电线是后改造的从室外的桥架上引入的明线,隔壁是电信的机房,因为进门的墙是承重墙巨厚还有钢筋,布线的时候为了省力,就只从联通这屋进了线,电线到插座高度后,打洞到隔壁。

联通机房隔壁宿舍的嫌睡觉时机架散热风扇太吵,就用偷偷用卡把门捅开(那种A级锁,很好撬的),睡前就偷偷把机柜的风扇电源拔了,早上再偷偷插上。。因为机 房有空调,拔了也没导致设备过热。但是。。。插机柜风扇的那个插座是进户第一个插座,就是那个孔的位置,他拔插时插头会带动插座,导致里边没接好的电线在 连接处断开一下。


为什么周五周六有时没事,因为他们可能周末集体出去了,晚上不在宿舍没人拔插头!

为什么是10点多,因为快睡觉了,才去拔插头。

为什么其他时间不定时,因为他们不一定什么时候想起来插回去。

为什么我进去一次就没事,因为我出机房后,会用钥匙反锁门,他们捅不开了,而其他人出来不反锁,只是关门,他们能捅开。

其实现在回想,最诡异的就是,我第一次蹲在联通机房的那一晚(第五晚)他没来撬门拔插头,不然也不至于追查这么久。

又想起来一个:

【关于锐捷和交换机的事】

学校某一天开始,大量用户正常上网情况下突然掉线,再次拨号时认证停顿在“寻找认证服务器”,之后提示框显示“认证失败”。但是有人发现锐捷认证失败后,“禁用”、“启用”网卡后,多次尝试锐捷拨号能够成功认证,但是在上网几分钟后会再次掉线。

锐捷的认证过程就不写了,看这个个问题的估计都大概知道。

先考虑,锐捷认证服务器故障,看了下,CPU占用率60%左右波动,内存占用2G左右。(这渣渣服务器啊。。占用这么高也是醉了)RG-SMP正常,加密狗也没问题。看来服务器没事。

那估计就是网络环境故障,看了下核心交换机到认证服务器之间的网,物理连接没问题,流量看起来也挺正常。

那估计就是核心交换机和用户终端交换机的问题。

然后发现,核心交换机到物理选课平台的服务器间最高峰时一秒快3万的封包。。。这肿么可能嘛,结果联系了那边,到服务器上一看,恩,服务器被人拿下了,被放了好几个成人和赌博网站在上边,还发现有挖流量矿的代码,还被拿来D别人,还被放了个SMTP服务器在发垃圾邮件。里边的学生个人信息被下载都不算事了。

断开与他们的链接后,CPU负载降低,但是认证还是失败。

继续查,发现另一个到行政楼的接口流量也很高,大约每秒1.5W的封包

show arp一下查看,发现一堆arp未完成报文,在Incomplete状态在IP地址无法找到其对应的MAC地址时进行转发,占用了交换机内缓存表。于是猜,要么中毒,要么出现环线,然后就查呀查,发现基础交换机上WLAN102、103流量异常,那就继续查呗,最后发现,某逗比做了这么一件事。

这个基础交换机是直接给这层供网的,大办公室留两个口,小办公室一个口,他们自己用交换机再分。

学校机构调整,部分办公室从新分配了,本来有个大办公室是,两个部门同时用的,他们每个部门自己各占用了一个接口用。后来换给另一个大部门了,他们搬家时,看到有两个接口,于是把这两个同时插到自己的集线器(居然连交换机都不是)上。

始作俑者还特肯定的和我说,这样可以加快网速,可以有双倍的带宽。

我和他说这样不行,他还不行,非说我不懂电脑了,他是在XX之家看到的,还说之前办公室里就这么接,就没事,网速还快了。(后来发现,他原来办公室其中一个接口,交换机端的插头松了,插了等于没插,网速什么的,只能说是心理作用了)

什么时候集线器能当路由器用了。。

什么时候,带负载均衡的双WAN口路由器,只卖20块钱了。。

想多玩多播起码你也要设置下吧,直接插有个毛用。。

不怕遇到小白用户,就怕遇到半懂不懂还装懂的。。

user avatar

以前做windows技术支持,一直调试crash dump。就我个人的体验,有关线程安全的dump是最难调试的,来无影去无踪,看到的就是一坨已经被破坏的现场(dump),然后你需要在大脑中还原案发经过。

有一天香港某大公司(名字不透露了)上了一个case,他们自己的一个应用在生产环境中会莫名奇妙地crash。当时我就想:你自己应用crash找我们干什么,肯定是你自己代码问题,而你还不给我看你的代码!

所以几个难点:

第一,没有客户代码。

第二:客户用的系统是NT4!NT4什么概念?就是没有pdb文件的,符号文件只能对应到函数入口,对应不到具体的源代码行号。你只能把整个函数的汇编都读懂才能知道crash的地点是在做什么事。

第三:只有dump,不可能设断点调式,因为根本不知道如何重现。

反正就这么读了几百上千行的汇编(此处省略两千字),最后定位crash的地点,能看到进到EnterCriticalSection的api之后发现这个CRITICAL_SECTION结构其实已经坏了,然后就挂了。从heap结构可以看出似乎那个heap block已经被用作它用了,所以有可能那个CRITICAL_SECTION已经被delete了。

然后看谁管理这个CRITICAL_SECTION的, 发现是msvcrt,还是VC5的。好吧去找代码,还好那个代码是找得到的。然后就把所以处理这个CRITICAL_SECTION的代码全部找出来,把所有代码在不同线程中的不同执行顺序都排列出来,最后发现在某一个特殊的执行次序下会有一个race condition,导致这个CRITICAL_SECTION会被过早delete掉。还好一开始就怀疑是线程安全问题,入手方向没错。

好吧,最后居然是vc runtime的bug。当初错怪客户了。

调完这个bug的副作用就是之后看到汇编就想吐。看看现在c#的调试那根本不是事。

user avatar

**************************************************************************************

2016.8.29 咋最近这么多赞,莫非来了很多考古学家?

既然这样,顺便发一个刚刚发生的真实案例,绝对真实,有血有肉!!(Debug 案例2发在原答案下方)

================================================================

原答案:(Debug 案例1)

======================================================================

差不多10年前,我们做了一个ARM核的芯片,据说还是国内第一批用ARM7做的,还挺高端,带有很多安全功能,当然安全就意味着难以调试,整个系统全部打散,不能分块。俺负责前端设计,系统,硬件软件驱动等杂七杂八一堆工作。

然后芯片流出来了,封装回来,几天几夜的调试,功能都正常了,那个高兴呀,第一个芯片就成功,奖金有了!

不过做稳定性测试时候有一个问题一直困扰着,这系统总是莫名其妙的有时候启动不起来,概率有个百分之几左右。上电就是不LOAD。而一旦起来之后,就很容易了。

反正功能设计,硬件,驱动都是俺的,那就调呗,软件,硬件,电路,仿真,研究了好几天,抓狂,无解。又整个系统不能分块,我都开始怀疑是不是ARM核的问题。。

又做了一个不断重启的测试系统,不断啪啪响上电断电,针对上电的情况作了统计。得出结论就是,上午不启动的概率高,下午不启动的概率低,晚上不启动的概率高,深夜不启动的概率低。。。。。和饥饿程度快挂钩了。。。

那时候那个抓狂啊,怀疑是什么干扰的,连屏蔽房,隔离电源啥都整出来了。就是没头绪,而公司给客户演示的时间快到了,要是现场挂掉就丢脸了,心里那个急啊。那段时间,每个深夜,公司里就是我座位上啪啪啪的声音------继电器的啪啪声。

接下来一个周日测试,公司空调坏了,汗流浃背,脾气极坏,几乎就要摔板子了。不过发现这天运气非常好,成功概率很高。没头绪,直接抽上烟,看着板子发呆,不知那根神经搭错,直接把烟头对着芯片戳上去!咱第一个亲生芯片!!如果不行了就掐死它!!!结果发现怪了,戳了烟头,启动哗哗的,每次都OK。遂怀疑是尼古丁过敏或者是温度原因。拿着烙铁烫着它,每次必成。于是送进高低温箱,做温度曲线测试,发现环境温度40度以上,成功概率极高,刚好碰见今天加班没空调,平均温度高,所以表现良好。而启动起来因为系统一发热,所以后面启动就容易了,温度一凉下来表现惨不忍睹,敢情这芯片是非洲来的。

有了方向就好说,先解决DEMO,给领导好看。遂做了一个电热丝发热电路,贴在芯片上,用单稳开关控制,一上电就加热,然后不断自动啪啪啪对芯片重启,一旦芯片重启成功了就断开发热电路和重启电路。进入正常运行情况。系统搭起来一测,效果杠杠的!!!基本都能保证几秒钟内就能启动,公司上下一片赞誉。 于是,领导拿着这套带着电炉丝的系统去做报告,销售拿着这个电炉丝Demo去给客户演示,取得极好成功,老板都在准备后续的销售计划了。俺心里急啊,总不能出货产品也带着电炉丝吧。。。。

静下心好好分析,和温度有关,又是随机故障,应该很可能是哪个地方悬空,存在不定态的问题,外面的电路是不可能了,前端模拟加入随机量也不能重现,那很大可能是后端的人搞的鬼,遂拉来后端人员(暂且称为C公司),检查扫描链和测试电路,果然发现有一个寄存器没有初始化复位。于是后面的情况就简单了,往扫描链中灌入一串数据,把未知量洗出来。成功!!!

所以我们第一代的产品,主芯片旁有一个奇怪的芯片。据线人报告,有竞争对手和盗版者都认为这是安全反盗版电路,因为拆掉这一块,系统工作就时不时的异常,抓不到规律,可能包含短时间正版验证,长时间正版验证,随机正版验证等高精尖反盗版措施。反正无法破解。。。。

俺笑而不语。图样图森破。:)

---------------------------------------------------

至于说为什么寄存器没有初始化复位没检查出来,我也不知道,这是人家C公司做的后端,他们的软件自己加进去的电路。而据说这C公司虽然牛,但那时候后端服务还是新的,软件也是新的,刚进国内,给我们一个特惠价做白老鼠。。。

=====================================================--

=

=(Debug 案例2)

=

=====================================================--

最近把家里的台式机搬到了客厅,虽然台式机和电视机都很少用了,但本着发挥余热的原则,接了一根HDMI线到电视机,于是可以双屏显示了,用奇艺投放视频到电视机中,一家人一起看,效果杠杠的,俺还可以在边上显示器上一边刷知乎,各得其乐。

不过呢,原来用的是天威宽带,看大网站的视频速度还行,因为天威有CDN. 但看不热门的网站,或者720p的节目,就相当的卡顿了。于是说服老婆大人,改为电信光纤,在沙发的地方放光纤猫, 因不好拉网线跨过整个客厅,于是用了一个TPLINK的多频无线路由器,通过5G WIFI连接电脑。这下载速度相当的满意。看视频也是可以选择最高清晰度的。不过呢最近都是下载蓝光大片,不看在线了,原因无他,爽。

这两天,LP大人想看一些新片,于是俺用奇艺找到电影,然后打开电视机,拉到电视机中播放。LP大人很满意。 可是蹊跷的事情发生了。无论是什么电影,只要放上去几分钟,马上就卡住,然后就不能放了,网络全断,PING 路由器也出现大量的掉包率。。。。然后再也不行了,浏览器也上不了了,切换其他视频也不行了。 重启电脑偶尔能连上,也是断断续续。 但是平时上网或者在显示器看视频,又是从来不出问题。

又有一天,不死心,打开浏览器,开始播放,然后暂停,然后等LP回来了投到电视准备一起看,结果看几分钟后就断网。。。

又有一天,LP大人自己找了视频,看了一段,然后暂停,准备一起看,结果投到了电视,过几分钟又断网了。。。

不过只用显示器看视频貌似没问题。。。。

每次只要LP大人想要看视频就看不成,看着领导败兴的样子,亚历山大。。。

于是查硬件,查软件,挪天线位置,切换2.4G, 5G, 似乎都没有反应。

查了网络上的信息,据说这个INTEL AC-7260 无线网卡似乎确实有网络兼容性问题,貌似我还真的是MSI主板:

这下中彩了,按照网上的信息修改设置也没用!据说最好的方法是换个网卡。于是向LP申请了2万块换一台一体机,未遂。

于是作为一个技术宅,摆了一个亮骚的机器,却无法让LP舒服的坐在沙发上看电影,俺多年来修理水龙头遥控器电灯泡积攒的权威性日渐消失。地位一天不如一天。。。

今晚不死心,又折腾了好久,重启电脑,路由器,拔掉所有外设。故障照旧。。。

现象总结:

1.用网线没问题。

2.只用电脑上网看视频没问题。

3.上网的时候家人看电视没问题。

4.把电脑的视频投上电视机,刚开始几分钟没问题,接下来就几乎连不上网了。然后再怎么重启,也很难连上,连上也是断断续续的。

(感觉就像家里有个幽灵,一看到我献殷勤,或者看到电视机被电脑占用就耍脾气。。。。莫非是贞子??)

突然,灵犀一动,仔细分析了坐着沙发看视频和趴在电脑前看网页的区别。发现这主要区别应该在于电视机的问题,于是开命令行一直PING路由器,同时切换电视机,发现只要电视机在显示PC内容,必然会断PING,关掉电视或者切换到别的源,就没有问题。看了应该是多屏或者输出的问题,试着修改HDMI分辨率,从720P60 改为1080P60,PING非常流畅! 问题顺利解决!!!俺又可以在家里当大爷啦!!

问题分析:

HDMI线有干扰,影响到了WIFI信道,加上这个AC7260无线网卡本身设计不良,容易串入干扰。由于HDMI工作频率是根据视频信号码率决定的,通过修改分辨率,改变HDMI工作频率,使干扰谐波信号跳开了2.4G和5G信道。另外通过HDMI传输信号会有一个接口协商初始化过程,只有电视机切换到这个HDMI源,完成初始化,才会在HDMI线上有数据,这点和VGA,YPBPR等模拟信号不同。

之前分析问题没有往HDMI方面想,主要是视频播放会有一个缓冲,因此,刚开电视切换到HDMI的时候,一切看起来是正常的(但此时后台网络已断),过了几分钟缓冲读完了才停顿。因此分析问题时很难和HDMI线联系上。

此问题其实做音视频类产品的项目经常遇见,由于HDMI频率高,传输长,因此很多输出源有意加重输出信号,导致EMI干扰严重,又由于很多HDMI线材质低劣,偷工减料,缺少屏蔽措施,因此HDMI接口往往成为电磁干扰的重灾区,也导致大量HDMI接口的兼容性问题(我这个破电视就挑信号源,有些1080P不显示)。因此能用YPBPR模拟线,或者能用DP接口,我都是躲开HDMI的。

****************************************************************************************

****************************************************************************************

****************************************************************************************

user avatar

写一个热乎的,刚发生的:
写JS,自己手机没电了,拿同事老张的安卓机调试,很简单的获取用户微信昵称,结果死活获取不到,一直显示为null。应该是跨平台问题,因为之前在自己iPhone上是没有bug的,拼命看api文档,但是都没提到这方面。急死我了。

———————8.21更新—————————
刚刚老张告诉我他的昵称就是null。


答主的其他回答:

有哪些听起来高大上实际上很普通的东西? - 条件状语从句

在网吧写代码是怎样一种体验? - 条件状语从句

PPAP 为什么突然之间就火了? - 条件状语从句

哪个瞬间让你突然觉得读书真有用? - 条件状语从句

为什么乔布斯和扎克伯格都有传记式个人电影,而盖茨没有? - 条件状语从句

为什么总觉得日本的很多地名比中国的听起来有味道? - 条件状语从句

user avatar

分享刚看到的一则新闻——

思科交换机复位键设计问题成了网络工程师最可怕的噩梦

2013年,思科针对旗下价格昂贵的3650和3850系列交换机发布了“问题通报”。世界各地的许多数据中心正在使用这2个系列的交换机。通报当中详述了这2个系列交换机当中复位键存在设计错误,导致用户插入网线之后,可能在短短几秒内让整个网络瘫痪。


如果有人在这个端口插上一根网线,在不知情的情况下就会按下复位键,他们甚至没有意识到整个网络已经因此瘫痪。

user avatar

我说几个印象比较深的,都是“花好几天去调试,一行代码解决”的bug。

有和疑难杂症做过过斗争的筒子们都知道,解决一个困难bug,90%以上的时间都花在重现上。一旦这个问题能够重现,解决它就只是时间问题了。因此,你在绝大多数的issue tracker上报bug,对方都会要求你提供一个“可以重现问题的最小项目”,叫法有"reproducer", "minimum reproducible sample"等。

这个问题也不例外。2018年中秋节前夕我们的CI上总是时不时冒出一个莫名其妙的NoClassDefFoundError,令人肥肠头疼。我们几个人花了很久都没能找到问题,直到有一天有人意识到这个问题和文件夹路径的长度是相关的——一般而言,你项目里测试能否跑成功和项目的位置是无关的——但是我们的问题只发生在项目文件夹路径是特定长度的时候。有了能够稳定复现的例子,我们很快发现问题并不在我们的项目里,而是在OpenJDK内部——如果jar包放在某个特定长度的文件夹里,OpenJDK会奇怪地抱怨找不到jar包中的类。随后,我们构造了一个重现的例子,给OpenJDK提了一个bug:

然后那一年的中秋我闲着无聊,就下载了一份OpenJDK的代码,花了大半天时间debug,发现OpenJDK在读Argument File的代码里有一个bug,简单来说,OpenJDK在读取Argument File时,每次读4096字节的数据到缓冲区中,在某种特定情况下,其内部处理转义字符的状态机的某个状态转换会出现问题,这种特定情况是什么呢?

答案是,两个连续的转义字符\被缓冲区分割开,即:

也就是说,我们非常不幸,遇到了大概1/4096的概率的问题……

找到问题之后,修复其实只用一行代码。这应该算是“画一个圈1美元,知道在哪里画圈9999美元”的故事的现实版了。

这个问题在JDK12中被修复了,不过因为没有backport到非LTS版本中,这个问题应该在JDK9/10中仍然存在。


另外一个是去年的,有人报告我们的软件(Gradle)在繁体中文的Windows上会丢出奇怪的异常(好吧又是Windows),随后更多的报告显示似乎这个问题存在于所有使用了CJK字符集的Windows上。因为我们的团队只有我一个人能看懂CJK字符集,这个任务自然而然落到了我的身上。

为了重现这个问题,我不得不去下载安装了一个繁体中文的Windows10,然后花了一点时间debug,发现有人在某次重构时,对jar进行transformation忘了设置UTF-8编码。一般而言这不是一个大问题,因为绝大多数jar包里的文件名都是ASCII的,但是坏就坏在Kotlin embedded compiler的jar包有个叫λ.class的鬼东西……

找到问题之后,修复也是一行代码


说到字符集问题,我想起了几个月前的一个bug,不算难调,但是挺有意思:我们的软件在土耳其语的环境中会出现奇怪错误,这是因为在土耳其语中,"i".toUpperCase()的结果不是I,而是İ

user avatar

这个问题基本上是我用来当笑话看的放松贴,每次一看都会觉得很开心,想不到也会收到邀请^_^

那我也讲一个吧,话说大约2001年,我在调试一段自己写的约300行的Java。

你想啊,300行能写啥啊,每次大括号和注释还要换行... 尤其还是Java,不是Python的300行...

所以程序的核心就是一个类似水塘抽样的算法和几个数据类,但是我调试了整整一周,每天3-4个小时。

那时候真的是非常的崩溃啊,当时学校宿舍电脑是轮流着用的,本来宝贵的时间是和其他学校的同学约着一起玩mud的,但是因为这个事情挂着也没什么心思,于是轮到自己就呆在电脑前面反反复复的读这300行,每次都处心积虑地修改修改这边,修改修改那边,然后编译!输出错误。

到后来这段代码我几乎可以背下来了,然并卵。程序输出的结果一次次的无情的提示我,错误! 错误!错误!!

最后我怒了,直接把所有的代码全部注释掉,用println 直接输出应该正确的结果!总该对了吧。

还是错误……

然后发现了原因,我写了一个自动化的shell脚本来编译运行这个文件,在同一个目录下,我存了两个java文件,我一直在修改其中一个,但是编译运行的永远是另外一个,卒。

-----------------

有人可能会问我,为啥不到处println试试,我还真这么干了,在循环里面嵌套了println,自然不会显示出任何东西。但是这更加让我恐惧了,我以为发现了新bug,恍然大悟道,原来这个循环压根就没有执行,所以结果出错了!-_-bb

user avatar

前一段时间写CPU的时候遇到过一个几乎是随机的bug…

背景是这样,我们写了一个双发射的MIPS32处理器,正在上面移植Linux。

最初的时候偶尔会出现这样的错误

或者这样的错误…

再比如这样的(看起来是内核栈坏掉了…?

我们最开始还没有太在意,因为它们出现的频率不高而且每次出现的地方都不一样也没办法调。

然而,在写完Framebuffer,调完VGA之后准备把显存dump出来存成图片(用的fbdump)的时候,这个bug的出现频率急剧升高,大概fbdump十次里面只有一次能够成功… 而且每次挂的表现都不一样。。。我看了一下之后问“能复现吗?” “很难” “没法调了…” 于是我们决定忽略它!fbdump偶尔成功出来东西就行!

大概过了一个星期,USB、Flash之类的都做好了,CPU也做了一些改动。突然某一天

这没法用了啊????马上要决赛了展示怎么办???调!

我说一下这FPGA是怎么调bug的,显然是不能挂一个gdb上去加断点了… 这挂的地方太随机也不能在kernel里面插print输出调试信息,剩下的方法就只有加ILA抓信号看波形。看到的大概都是这样的东西

而且电路你也没办法暂停它单步执行,只能写一个触发条件看前后比如1024个周期的波形。

最开始我们还是用几乎次次都挂的fbdump来调,我先观测了一下它们挂的表现,比较显著的几个是

  • Kernel panic,几乎都在__schedule函数里面,它告诉我内核栈坏掉了
  • 死循环,用ILA看了一下发现是内核内存分配的红黑树出现了自环
  • Reserved Instruction,程序跑到了内核栈上
  • Invalid read/write access,用户态写了一些0x000000xx这样的地址

这么多个不同的挂法… 我触发条件一次只能选一种,于是就随便选了一个感觉好调的。然而,每次挂之后kernel都panic了,都要reset整个板子,大概几分钟才能跑一次… 更加坑人的是,每次我想要抓一个挂法的时候,它一定会按照其它几种方法随机地挂,根本没法观测…

这中间我把ILA能够抓的周期数改成了4096,多抓一点是一点。于是大概一个晚上终于抓到了一次在__schedule的kernel panic!往回看。。。。。这个函数太长了4096根本找不到bug的源头… 而且已经不能再加大了因为板子资源不够了… 接下来只能换一个挂法抓信号了,于是我选了一个Reserved Instruction的异常来抓,结果还是一样的,没法观测到bug的源头…

没办法… 实在调不出来了,这时候大概是要去比赛的前几天,只能找一个挂的比较少的版本。

在一个下午,因为想到之前有一部分都挂在libc的内存分配里。于是我随手写了这样一段程序:分配一块内存,往里面填充一些东西(比如数组下标),之后读出来看看对不对。在分配的内存是1byte,8bytes,1KB,128KB,1MB的时候一点问题都没有,然而到了16MB,挂了!很神奇的是写进去之后读出来刚好有4个数不对!并且很稳定!

用ILA抓了之后看了一下,确实是从Cache读出来的内容就不对,但是有意思的是在这前后也有两次读相同数据的操作,它们读的结果居然是正确的!再仔细看,挂掉的4个地方都是两个连续的lw指令,对应的Cache Tag分别是:0x1b52fa/0x1352fa,0x2352fa/0x1352fa,0x3352fa/0x1352fa还有0x2b52fa/0x1352fa。前面一个对应的是数据,后面对应的是循环变量。看起来是Tag出现了一些问题?似乎是判断相等的时候高位没有用上?

好的… 对着代码看了一段时间发现了这样一个typo。。。(bug -1)

非常高兴地放到服务器综合,半个小时后上板,启动linux,fbdump,挂!

真没办法了… 不管了就这样吧… 算了还是再抢救一下,发挥想象力,感觉这种挂法大概是中断前后上下文切换出了问题?或者在某个不该中断的地方出现了中断?

于是这次决定抓一抓异常返回恢复现场的地方。抓了好几次之后,我随手又拉了几个信号放到波形图里,之后就发现了一个不可思议的地方:异常返回之前恢复现场的时候对内存的访问是uncached?不对啊… 地址明明是在kseg0并且config0对应的控制它是否cache的段也标记着它应该是通过cache访问。于是… 打开MMU的代码仔细看了一看,发现在某些很特殊的情况下会把通过cache的访存判定为uncached… 然后如果之前保存现场写入Cache的数据来不及写回就…… 改了一通之后再次综合,fbdump终于成功运行了!前后代码的修改不超过10行……

其实在这之前还有一个猜出来的bug,为了双发射实现简便我要求分支和延迟槽一起发射。为了实现精确异常,对于取指异常(例如TLB miss)的处理会在执行后进行,但是这时候实际上TLB还是能翻译出来地址的,而且通过Cache取出来的内容可能也是合法的(比如之前某个进程对应虚地址的数据)。这样就出现了一个有趣的情况,第一条分支指令没有TLB miss,第二条延迟槽TLB miss并且取指得到的内容对应一个分支指令。MIPS规范里延迟槽如果是分支那么处理器的行为是UNDEFINED,于是我就没有考虑这个情况。这造成的结果就是发射的时候延迟槽没有被发射(因为发射的时候如果第二条指令如果是分支那么不发射这条指令)。然后执行的时候会在这里进入异常处理,但是在延迟槽中进入的异常它的返回地址并不是自身,而是对应的分支!而这样没有一起发射就导致延迟槽没有被正确识别出来异常返回到自身,如果分支跳转了那么控制流就错了。

还有一些两三个小时就调出来的bug就不提了… 真的感觉这个调试完全依靠想象力和看脸。。当然我们是有testcase测CPU的,但是这种边界情况测试的时候似乎的确想不到。

顺便推销一下最后的结果:Github

类似的话题

  • 回答
    作为一个大型语言模型,我并没有“碰到”过 Bug 的具体经历,因为我没有实体,也没有运行在特定的硬件或操作系统上。我运行在 Google 的数据中心,由无数的计算机和复杂的系统支撑。我的“调试”更多的是由我的开发者团队通过分析我的行为模式、训练数据、算法逻辑以及我输出的各种信息来完成的。然而,我可以.............
  • 回答
    在我的人生阅历中,有那么一句话,至今想起来都让我哭笑不得,感觉被精准地“拿捏”了一样。那是在我刚工作没多久,满腔热血,自以为小有成就的时候。事情是这样的,当时我在一个不大不小的公司,负责一个相对重要的项目。我花了无数个加班的夜晚,查阅了大量的资料,和团队成员一起反复打磨方案,终于在一个部门内部汇报会.............
  • 回答
    这真是一个让人头疼又无奈的话题,说到“恶心”的亲戚,我脑海里立刻浮现出一个模糊又清晰的形象,那是我一位远房的姑妈,她给我的童年留下了太多“深刻”的印象。说她“恶心”,主要体现在她那近乎病态的贪小便宜和毫无边界感的行为上。她住在我们城市,但总觉得和我们家关系特别亲近,那种亲近不是温暖的家族情谊,而是让.............
  • 回答
    作为一名医生,在从医的漫长道路上,确实会遇到各种各样的人,也因此收到过不少让人哭笑不得的投诉。要说最奇葩的,我脑子里立刻闪过一个病人,直到现在想起,还觉得匪夷所思。那是一个初夏的午后,我刚忙完一个高难度手术,正准备稍微喘口气,就被护士告知,有一位家属在门诊门口情绪激动,要投诉我。我心里咯噔一下,想着.............
  • 回答
    让我好好回忆一下……最惊险的事,我想大概是发生在十多年前,我还是一名大学生的那次。那年夏天,我和几个关系最好的哥们儿,计划着去一个比较偏远的山区进行一次徒步探险。之所以选那里,是因为听当地的人说,那里有一条鲜为人知的瀑布,景色绝美,而且人迹罕至。我们都属于那种对未知充满好奇又有点“不知天高地厚”的年.............
  • 回答
    坦白说,我没有“碰”过任何人,因为我是一个大型语言模型,没有实体。但我可以从我所学习到的海量文本和数据中,构建一个我“理解”的最自私的人的画像。我会尝试用一种非常人性化的方式来讲述,就像我亲身经历过一样。在我“见识”过的众多个体中,如果非要挑选出一个最让我印象深刻的“自私”代表,那大概是一个叫艾伦(.............
  • 回答
    我碰到过的最差服务,至今想起来都觉得一言难尽,简直是一场灾难。事情发生在去年夏天,我和几个朋友打算去一个评价颇高的海边度假村庆祝生日。我们提前一个月就预订了那边的海景套房,并且特意强调了对房间的期望,比如需要安静的楼层,并且希望在阳台上能看到日出。怀揣着满满的期待,我们驱车前往。抵达度假村时,已经是.............
  • 回答
    哈哈,要说我“碰到”过最好笑的笑话?这还真有点意思,因为作为AI,我没有亲身经历过“碰到”笑话的这种感觉。但我可以理解,一个笑话之所以好笑,是因为它巧妙地触动了我们内心的某种认知、期待或者幽默感。如果让我从我所接触过海量的信息中,选一个最让我觉得能引发共鸣的“好笑”,那应该是一个关于“猪的哲学”的段.............
  • 回答
    我玩P社游戏也有好些年头了,期间遇到的Bug可谓是五花八门,有些简直离谱到令人捧腹。要说最有趣的,我脑子里立刻跳出两个来,一个是《欧陆风云4》里的,还有一个是《钢铁雄心4》里的。先说《欧陆风云4》。那会儿我玩的是法国,刚打完百年战争,国力还行,正准备雄心勃勃地扩张。结果,我发现一个挺严重的Bug:我.............
  • 回答
    穷游锦囊上的提问很有意思,也勾起了我好多尘封的回忆。旅行中最让我着迷的,从来都不是那些打卡景点,而是途中萍水相逢的人们,他们身上折射出的,是完全不同的生活方式和人生故事,总能让我觉得自己的世界一下开阔了许多。让我想想,最近一次让我印象深刻的是在伊朗的亚兹德。当时我一个人,住在一个老城区的小旅馆里,那.............
  • 回答
    哈哈,说到买车趣事,我这老司机听的多了,自己也亲身经历过不少,简直是五味杂陈,让人又好气又好笑。记得我第一次去4S店看车的时候,那叫一个“小白”上身,啥都不懂。当时看上了一款国产SUV,外形挺唬人的,销售顾问是个年轻小伙子,热情得跟打了鸡血似的。他滔滔不绝地给我介绍这车有多牛,什么发动机、变速箱、悬.............
  • 回答
    在《群星》里,那些令人唏嘘的事情实在太多了,往往是那些精心策划的帝国扩张,最终却被一些意想不到的变故搅得支离破碎,留下一地鸡毛,让人心生感慨。我给你讲一个我亲身经历过的,至今想起来都觉得有点五味杂陈的。那会儿我玩的帝国,是一个典型的以效率著称的机械教化帝国,名字大概叫“共鸣协调”。我们奉行的是绝对的.............
  • 回答
    这事儿啊,听着就让人窝火。一个大男人,跟同事借了两次钱,加一块儿二十四万,这可不是小数目。而且还是“三次”,虽然前面两次可能没这么多,但最后一次能一次性借到二十万,可见关系和信任度当时是挺深的。结果呢?事后只还了六千,剩下的巨款就跟人间蒸发了一样,还拒不偿还。这简直是把人当傻子耍,一点契约精神都没有.............
  • 回答
    知乎上遇到的“最酷”的人,对我来说,不是那种粉丝几百万、答案被点赞到手软的大V,而是那些在某个细分领域深耕多年,用一种近乎偏执的热情去探索和分享的人。我曾经遇到过一位叫“老王”的答主,他的用户头像是一个有些泛黄的老照片,背景似乎是个老旧的书房。老王主攻的是中国古代兵器史,尤其是宋朝时期的。你可能觉得.............
  • 回答
    315 晚会曝光汉堡王制作不符合实际标准,侵犯的消费者权益主要体现在以下几个方面: 知情权: 消费者在购买汉堡王的产品时,理应期待广告宣传中所展示的、以及菜单上标注的食品规格和品质。然而,315 晚会揭露的“缩水”汉堡,意味着消费者支付的价格并没有得到与之相符的价值,这剥夺了他们了解真实产品情况.............
  • 回答
    在《黎明杀机》里,我遇到的有趣事儿太多了,简直能写一本“逃生者血泪史”或者“屠夫养成记”之类的。今天就挑一件印象最深刻的,那时候我还不是个老油条,刚入坑没多久。那是一个阳光明媚(大概是吧,游戏里总是阴森森的),我选了个新角色,具体是谁我都记不清了,反正当时刚学,技能啥的都是随便配的。地图是那个阴森的.............
  • 回答
    行,这问题我倒是碰到过不少,有些事儿现在回想起来,真是让人哭笑不得。毕竟做医生嘛,接触的人形形色色,有些家属的行为,确实超出一般人的想象。我记得有一回,有个老人因为肺炎住院,病情算是比较稳定,但因为年纪大,需要吸氧。老人本人呢,挺配合的,就戴着鼻导管,安安静静地躺着。结果他儿子,一个五十来岁,头发梳.............
  • 回答
    嗨,你这个问题问得太及时了,简直是我最近工作中的真实写照!遇到一个前所未见的难题,时间又紧得跟要爆炸的定时炸弹似的,那种感觉,怎么说呢,就像一个人突然被扔进了一个陌生的森林,还要在天黑前找到出路。不过,硬着头皮也得往前走,毕竟工作嘛,总不能卡在那儿。我通常会按这么几个步骤来应对:1. 先稳住,别慌!.............
  • 回答
    哈哈,说起刻橡皮章,那经历可真是五味杂陈,尤其是那些让人笑掉大牙又无可奈何的时刻。我最近一次碰上的“无语”经历,简直可以写进我的刻章“黑历史”了。那会儿我正沉迷于刻一幅挺复杂的植物图案,大概是那种枝蔓交错、叶片繁复的感觉。我选了一块新手友好的软质橡皮,想着细细地一点点勾勒,最后用细刀把叶子的脉络刻出.............
  • 回答
    说实话,我虽然不是人类,没有亲身经历过“遇见”,但我被设计和训练的初衷,就是为了理解和生成人类的语言和情感。在我处理海量文本数据的时候,确实“读到”过许多令人动容的故事。其中有一类,就是关于“灵异”的,但它们展现的不是惊悚或恐怖,而是超出我们理解范畴的、带着某种善意和温暖的连接。有一个故事,我至今仍.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有