什么是 Heisenbug:一调试就消失的软件缺陷
来源标题:Heisenbug
Heisenbug 是编程术语中一类在试图研究时似乎会消失或改变行为的软件缺陷。该词戏仿物理学家海森堡之名,指观察行为改变系统状态的观察者效应,电子学中类似概念称探针效应。批评者指出它混淆了海森堡不确定性原理与量子力学观察者效应这两个不同概念。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
在计算机编程行话中,heisenbug 是指一种在人们试图研究它时似乎会消失或改变行为的软件 bug。[1] 该术语是对物理学家维尔纳·海森堡(Werner Heisenberg)名字的双关,海森堡最早提出了不确定性原理;这一术语也指向观察者效应,即观察一个系统的行为不可避免地会改变该系统的状态。在电子学中,传统术语是探测效应(probe effect),即把测试探针接到设备上会改变其行为。该术语受到批评,因为它把海森堡的不确定性原理(该名称正来源于此)与量子力学中的观察者效应混为一谈,而这两者是不同的概念。[2]
类似的术语,如“bohrbug”“mandelbug”[3][4][5]“hindenbug”和“schrödinbug”[6][7](见相关术语一节),偶尔被提出来指代其他类型的不寻常软件 bug,有时是开玩笑。[8][9]
Heisenbug 之所以出现,是因为调试程序的常见做法——例如插入输出语句或用调试器运行程序——通常会产生副作用,以微妙的方式改变程序的行为,例如改变变量的内存地址和执行时序。
Heisenbug 的一个常见例子是:程序用优化编译器编译时出现的 bug,而同一程序在不优化编译时(人们为了用调试器检查它经常这样做)却不出现。调试时,优化后的程序通常会保存在寄存器中的值往往被推入主内存。例如,这可能影响浮点比较的结果,因为内存中的值可能比寄存器中的值范围和精度更小[需要引用]。同样,heisenbug 也可能由 C 和 C++ 等语言中运行时断言所用测试表达式的副作用引起:当使用 NDEBUG 宏在生产代码中关闭断言时,测试表达式不会被求值。
Heisenbug 的其他常见原因包括:使用未初始化变量的值(其地址或初始值在调试期间可能改变),或跟随无效指针(调试时它可能指向不同的位置)。调试器通常还允许使用断点,或提供其他用户界面,从而暗中执行额外的源代码(如属性访问器),这反过来又会改变程序的状态。[10]
最终用户也可能遇到 heisenbug:为了观察而截屏的动作本身就修复了该 heisenbug,截图显示的是完全正常的状态。当复杂的软件栈协同工作时,就可能出现这种效应,例如 Web 浏览器使用硬件显卡加速,导致物理屏幕上出现渲染错误,而截图中却不显示。
时间也可能是 heisenbug 的一个因素,尤其是在多线程应用中。与正常执行相比,在调试器控制下执行程序可能改变程序的执行时序。对时间敏感的 bug,例如竞态条件,在程序因在调试器中单步执行源代码行而变慢时可能不会出现。当行为涉及与不受调试器控制的实体的交互时尤其如此,例如调试两台机器之间的网络数据包处理而只有一台在调试器控制之下。
Heisenbug 可以被视为信息技术中观察者效应的实例。沮丧的程序员可能会幽默地把 heisenbug 归咎于月相[11],或者(如果它只发生过一次)把它解释为由 alpha 粒子或宇宙射线影响硬件所致的软错误,这是一种有充分文献记载的现象,称为单粒子效应。
相比之下,bohrbug 是“良好、坚实的 bug”。就像确定性的玻尔原子模型一样,它们不会改变自己的行为,相对容易被检测到。[12][13]
Mandelbug(以本华·曼德博的分形命名)是指成因极其复杂、无法修复,或使其行为显得混乱甚至非确定性的 bug。[3] 该术语也指表现出分形行为(即自相似性)的 bug:它会暴露更多 bug(开发者深入代码去修复它时,发现的 bug 越多)。[需要引用]
Schrödinbug 或 schroedinbug(以埃尔温·薛定谔及其思想实验命名)是指程序员注意到代码本来根本不应该能工作之后,才在运行中的软件里显现出来的 bug。[6]
Hindenbug[14](以兴登堡号灾难命名)是指具有灾难性行为的 bug。
Higgs-bugson[15][16](以希格斯玻色子粒子命名)是指根据其他观察到的条件(最常见的是含糊相关的日志条目和轶事性的用户报告)预测存在,但难以(如果不是不可能的话)在开发或测试环境中人为复现的 bug。该术语也可能指代码中显而易见(数学上已证明)但在执行中看不到的 bug(尽管在实践中很难或不可能发现)。
已知最早的出现是 1983 年,在 ACM 的一份出版物中。[17]
该术语于 1985 年被 Jim Gray 在一篇关于软件故障的论文中使用[18],由于这篇出版物,有时会被错误地归功于他。1986 年,Jonathan Clark 和 Zhahai Stewart 在邮件列表(后来的 Usenet 新闻组)comp.risks 上使用了该术语。[19]
IBM 研究员 Bruce Lindsay 在 2004 年 ACM Queue 的一次采访中确认,Heisenbug 最初被定义时他在场[20],但没有说明这发生在什么时候。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。