海森堡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宏關閉斷言後,測試表達式不會被求值。

海森堡bug的其他常見原因是使用未初始化的變量的值(調試時此變量的初始值或地址可能有變化),或者使用了無效的英語Fandango on core指標(調試時可能指向了不同的地方)。調試器也經常提供監視器(watches)或其他用戶界面,它們也可能添加額外的原始碼來隱秘地執行(例如屬性存取器),從而改變程序的狀態。[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。

希格斯bug子(higgs-bugson,名字取自希格斯玻色子)是一個基於觀測到的條件(最常見的是模糊相關的日誌項和似是而非的用戶報告),而預計會出現的bug,但它幾乎不可能在開發過程和測試環境下重現。這個詞也可能指代一個在代碼中的明顯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]

解決

海森堡bug難以被發現和修復,而且在嘗試修復它的時候經常會引起更多意料之外的程序行為。原因是這種問題的出現通常是由另外一個bug為其提供支撐,使程序行為在調試過程中難以預測和分析。總體來看,隨著軟體的成熟,海森堡bug的數量將會減少。[21]

參見

參考資料

  1. ^ The Jargon File: heisenbug. [2017-04-09]. (原始內容存檔於2012-09-05). 
  2. ^ 飘忽无定的海森堡BUG教你搞定幽灵问题. 程式設計師:遊戲創造. 2008年, (4) [2017-04-09]. (原始內容存檔於2017-04-10). 
  3. ^ Bug的类型. 外刊IT評論. [2017-04-09]. (原始內容存檔於2017-04-09). 
  4. ^ The Jargon File: Mandelbug. Catb.org. [2013-09-05]. (原始內容存檔於2013-09-08). 
  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]. (原始內容存檔於2013-09-08). 
  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. [2017-04-09]. (原始內容存檔於2013-09-21). 
  17. ^ Gray, Jim. Why Do Computers Stop And What Can Be Done About It?. Technical Report 85.7. Tandem Computers. 1985 [2017-04-09]. (原始內容存檔於2014-12-19). 
  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]. (原始內容存檔於2013-05-30). 
  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頁面存檔備份,存於網際網路檔案館):
  21. ^ P., Birman, Kenneth. Reliable distributed systems : technologies, Web services, and applications. New York: Springer. 2005 [2019-08-06]. ISBN 0387276017. OCLC 225378026. (原始內容存檔於2018-02-24). 

外部連結