本页使用了标题或全文手工转换

海森堡bug

维基百科,自由的百科全书
跳到导航 跳到搜索

程序设计术语中,海森堡bug英语:heisenbug)是指在尝试研究它时似乎会消失或者改变行为的bug(程序错误)。[1][2][3]该词汇是物理学家维尔纳·海森堡名字的双关语,他最先断言了量子力学观察者效应——观察系统的行为不可避免地将改变其状态。电子学中的传统用语则是探针效应英语Probe effect,指连接一个测试探针英语Test probe到设备将改变其行为。

类似的词语有玻尔bugbohrbug)、曼德博bugmandelbug[4][5][6]薛定谔bugschrödinbug[7][8],它们偶尔被用于指代其他类型的非寻常软件缺陷,但通常以开玩笑的心态使用。[9][10][11]

例子[编辑]

之所以会出现海森堡bug,是因为通常的调试手段,诸如插入输出语句或是挂接调试器,往往会修改程序代码,或是更改变量内存地址,或是改变其执行时间。这都可能影响程序的行为。如果正好影响到了bug,就有可能产生海森堡bug。

海森堡bug的一个常见情况是,bug只在打开編譯器优化时出现,而关闭优化再编译程序(使用调试器时通常如此)则bug消失。一些在优化后的程序中通常会放入寄存器的值,在调试状态下会放入到主内存。这可能会影响浮点数比较的结果,因为内存中的值可能比寄存器中的值有更小的范围和精度[來源請求]。与此类似,CC++等语言中使用的运行时断言的副作用可能导致海森堡bug,因为当生产环境的代码使用NDEBUG宏关闭断言后,测试表达式不会被執行(eval)。

海森堡bug的其他常见原因是使用未初始化的变量的值(在调试模式下此变量的值可能不同,或者调试系统自动将其初始化),或者使用了无效的英语Fandango on core指標(调试时可能指向了不同的地方)。调试器也经常提供监视器或其他用户界面,它们也可能导致执行额外的源代码(例如属性存取器),从而改变程序的状态。[12]

时间也可能是海森堡bug的一个因素,尤其是对于多线程应用程序而言。在调试器控制下执行的程序与正常执行的程序在运行时间上会有差异。使用调试器进行逐行单步调试时,时间敏感的bug(例如競爭危害)可能不会发生。当行为涉及到与不在调试器控制下的实体进行交互时(例如两台计算机之间的网络数据包处理),则更是如此。

海森堡bug可以被视为信息技术中的观察者效应英语Observer effect (information technology)的一个实例。沮丧的程序员可能会幽默或无奈地指责一个海森堡bug是由于月相[13]或其他因素,或者猜测它是因为Α粒子宇宙線影响计算机硬件而导致的軟性錯誤所致(如果只发生了一次)。

相关词汇[编辑]

词汇“bohrbug”是海森堡bug的一个反义词,它指良好、稳固的bug。就像确定性的玻尔模型一样,它们不改变自己的行为,并且相对容易被检测到。[14][15]

曼德博bug(mandelbug,名字取自本華·曼德博曼德博集合)是原因极其复杂而很难修复的bug,其行为看上去混乱甚至存在不确定性。它也指程序员检查代码、修复它们时会发现更多bug的bug。[來源請求]

薛定谔bug(schrödinbug,名字取自埃尔温·薛定谔及他的薛定谔猫)是程序员发现一个永远不应该被触发的情况发生的bug。[來源請求]

兴登堡bug(hindenbug,[16][需要更好来源]名字取自興登堡號空難)是具有灾难性行为的bug。

词汇历史[编辑]

该词汇在1985年被詹姆斯·尼古拉·格雷在一篇关于软件故障的论文中使用[17],并也在1986年由Jonathan Clark和Zhahai Stewart在邮件列表(之后的Usenet新闻组)comp.risks英语comp.risks中使用。[18]

供职于IBM的研究员Bruce Lindsay英语Bruce Lindsay (IBM Fellow)在2004年的ACM Queue英语ACM Queue采访中确认,Heisenbug被最初定义时他在场。[19][何意?]

它于1983年在ACM的出版物中有更早的出现。[20]

解决[编辑]

Heisenbug通常需要非常仔细地调试才能解决。如果能找出出错代码的近似位置则能更快地找出。在那个位置附近可以检查相关上下文和分析进程转储来寻找解决方案。

另一种方法是检查日志,尤其是由lint或类lint工具产生的日志。

对于长期、持久的海森堡bug,它可能需要使用诸如抽象释义靜態程序分析技术来确定其原因。

参见[编辑]

参考资料[编辑]

  1. ^ The Jargon File: heisenbug. 
  2. ^ 飘忽无定的海森堡BUG教你搞定幽灵问题. 程序员:游戏创造. 2008年, (4) [2017-04-09]. 
  3. ^ Bug的类型. 外刊IT评论. [2017-04-09]. 
  4. ^ The Jargon File: Mandelbug. Catb.org. [2013-09-05]. 
  5. ^ Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996
  6. ^ Clarke, Arthur C., The Ghost from the Grand Banks, Bantam Books, 1990
  7. ^ The Jargon File: Schroedinbug. Catb.org. [2013-09-05]. 
  8. ^ Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996
  9. ^ The following article investigates the various definitions of bohrbug, mandelbug and heisenbug proposed in the literature, as well as the statements made about the relationships between these fault types: Grottke, Michael; and Trivedi, Kishor S.; Software Faults, Software Aging and Software Rejuvenation, Journal of the Reliability Engineering Association of Japan, Vol. 27, No. 7, pp. 425-438, 2005.
  10. ^ Grottke, Michael; and Trivedi, Kishor S.; Fighting Bugs: Remove, Retry, Replicate, and Rejuvenate, IEEE Computer vol. 40, no. 2 (February 2007), pp. 107-109
  11. ^ A February 2012 Google Books search returns about 70 hits for "schroedinbug", 100 for "mandelbug", 400 for "bohrbug" or "heisenbug".
  12. ^ "Java toString() override with initialization as a side effect" 互联网档案馆存檔,存档日期2014-12-30.
  13. ^ CATB.org, "phase of the moon"
  14. ^ Goshgarian, Gary; Exploring Language, HarperCollins College Publishers, 1995
  15. ^ "Such transient software failures have been given the whimsical name “Heisenbug” because they disappear when reexamined.
  16. ^ Hinden Bug. 
  17. ^ Gray, Jim. Why Do Computers Stop And What Can Be Done About It?. Technical Report 85.7. Tandem Computers. 1985. 
  18. ^ (16 December 1986) RISKS DIGEST 4.30 - (23 December 1986) RISKS DIGEST 4.34, moderated by Peter G. Neumann
  19. ^ "A Conversation with Bruce Lindsay", ACM Queue vol. 2, no. 8 - November 2004. Queue.acm.org. [2013-09-05]. 
  20. ^ Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering Symposium on High-Level Debugging, Pacific Grove, California, March 20–23, 1983, Association for Computing Machinery, 1983, Google Books search:

外部链接[编辑]