海森堡bug

科技工作者之家  |   2020-11-17 18:16

在计算机编程术语中,海森堡bug,又叫heisenbug是一种软件错误,当人们试图研究它时似乎会消失或改变其行为。 这个术语是Werner Heisenberg的名称上的一个双关语,物理学家首先声称量子力学的观察者效应,它指出观察系统的行为不可避免地改变了它的状态。 在电子学中,传统术语是探针效应,将测试探针连接到设备会改变其行为。

类似的术语,例如bohrbug,mandelbug,hindenbug和schrödinbug偶尔会针对其他类型的不寻常的软件错误 jest; 然而,与术语“海森堡”不同,它们并未被广泛认知或使用。

例子出现Heisenbugs是因为调试程序的常见尝试(例如插入输出语句或在调试器中运行它)通常会修改代码,更改变量的内存地址及其执行时间。

heisenbug的一个常见示例是当程序使用优化编译器进行编译时出现的错误,但不是在没有优化的情况下编译同一个程序时出现的错误(通常是为了用调试器检查它)。在调试时,优化程序通常保存在寄存器中的值通常被推送到主存储器。例如,这可能会影响浮点比较的结果,因为内存中的值可能比寄存器中的值的范围和精度要小。同样,Heisenbugs可能由运行时断言中使用的测试表达式中的副作用(如C和C ++)导致,其中在使用NDEBUG宏在生产代码中关闭断言时不测试测试表达式。

Heisenbugs的其他常见原因是使用非初始化变量的值(可能会在调试过程中更改其地址和/或初始值),或者跟随一个无效指针(可能指向调试时的不同位置)。调试器通常还提供手表或其他用户界面,这些用户界面会导致额外的源代码(如属性访问器)被隐式执行,从而可能会改变程序的状态。

时间也可能成为Heisenbugs的一个因素,特别是在多线程应用程序中。与正常执行相比,在调试器的控制下执行程序可以改变程序的执行时间。当程序在调试器中单步执行源代码行时,可能不会发生时间敏感的错误,例如竞争条件。当行为涉及与不在调试器控制下的实体进行交互时(例如在两台机器之间调试网络数据包处理并且只有一个处于调试器控制下时),情况尤其如此。

Heisenbugs可以被视为信息技术中观察者效应的实例。沮丧的程序员可能会幽默地指责月亮阶段的黑猩猩,或者(如果它只发生一次)可能会将其解释为由于阿尔法粒子或宇宙射线影响硬件而产生的软错误。

海森堡 Bug的特性海森堡 Bug 有这样一种特性 :当你试 图跟踪它时,它会突然消失或改变行为。其实,海森堡 Bug 这个名字的由来含有一定的戏谑成份:它取自德国物理学家海森堡的不确定性原理 (中学课本中可能称作 “测不准原理”),其描述和解释的是量子物理 中无法同时准确获知某一粒子位 置和速度 的现象。与其相关的还有一个现象,被称为观察者效应,即观察某一对象时,无法绝对地做到仅仅观测而不改变该对象,而 由观察者效应产生的问题 ,我们就称之为海森堡 Bug。在游戏的开发过程中,我们 经常会遇 到海森堡Bug ,在低级代码中尤其 常见 ,一旦无法正确处理1,将给项目带来灾难, 甚至需要花费数天时间去跟踪一个 Bug。

本词条内容贡献者为:

李嘉骞 - 博士 - 同济大学