最難忘的Bug除錯經歷
相信每位程式設計師都有過一段不堪回首地Bug除錯經歷,程式設計師一聽到自己的程式有Bug,會有各種搞笑的反應,大家可以移步去看看“ 程式設計師遇到Bug後的30種常見反應 ”。
目前,著名的社群問答網站Quora上出現一個很火的討論: What's the hardest bug you've debugged?很多程式設計師在下面留言,把自己最痛苦或者最難忘的Bug除錯經歷分享給大家,筆者就所討論的內容,整理了兩位程式設計師的回答。不知大家是否有過同樣的經歷。
Dave Baggett:程式碼、硬體 誰之過?
ITA Software聯合創始人、inky.com網站創始人Dave Baggett分享了自己痛苦的除錯經歷,在苦苦反覆測試程式碼後,竟然發現是硬體惹的禍。
我為Crash Bandicoot寫了記憶體卡(載入/儲存)程式碼,我花了6周時間才停止對這段程式碼進行除錯,在這段時間裡我還做了些其它東西,但還是會過來除錯這個Bug——可能是幾個小時、幾天。
在每次儲存程式的時候,程式就會一直訪問記憶體卡,並且進行正常工作。僅僅一個短暫的寫入操作,常常會破壞記憶體卡。玩家會儲存一些東西,而它不但不會去儲存,反而還會去破壞記憶體卡。
顯然,我們不能跳過這個Bug,即使6周後,我仍然也沒發現任何線索。後來,我們通過Connie把內容放到了PS1開發者論壇上,看是否有人遇到過類似問題?答案是否定的。
當程式設計師無計可施的時候,唯一能做的是對程式碼進行分而治之,不斷地去排查錯誤,消滅錯誤,直到最後剩下非常小的一塊,再去慢慢研究問題所在,可不幸往往就這樣,在排除了許多錯誤以後,該Bug還是會出現。
在這個過程中,我們所面臨的挑戰是如果把程式碼刪除了,該如何讓遊戲繼續執行下去?我們需要替換整個模組,並且模擬一些真實的東西,但實際上,這並未起到太大作用。你必須要編寫新的架構程式碼來保持整個遊戲的執行,這是慢且痛苦的過程。
我不停的移除越來越多的程式碼,直到只剩下啟動程式碼——僅僅是啟動這個系統並且初始化渲染硬體等。當然,這是肯定不會提供載入/儲存選單,因為我已經移除了所有的圖形程式碼。不過我可以假設使用者在使用(不可見)載入/儲存操作,並且詢問是否儲存,最後再寫入卡上。
最後,只剩下極少的程式碼在工作,但Bug仍然存在,大多數時候都可以正常工作,但每隔一段時間,它就會失敗。幾乎所有的Crash程式碼都被移除了,但仍然發生錯誤,太莫名其妙了,剩下的程式碼真的沒有做任何事情。
此時,大概上午3點左右,一個念頭在腦海一閃而過。讀和寫(I/O)操作需要精確定時。無論你是否在處理一個硬碟、快閃記憶體卡、藍芽發射機——不管怎樣,底層程式碼的讀寫操作必須要根據精確的時間點來執行。
時鐘週期讓硬體裝置可以不直接連線到CPU——並且讓程式碼執行與CPU保持同步。時鐘決定Baud Rate——資料從一端傳送到另一端的速率。如果時間混亂了,那麼硬體或軟體都有可能會有問題,這真的是太糟糕了,而且在通常情況下,還會導致資料損壞。
倘若我們編寫的設定時間的程式碼混亂了,那麼定時會發生怎樣的情形呢?我再次檢視了與時間相關的測試程式碼,注意到設定的可程式設計時間定時是PS1到1kHz(1000ticks/second),這是相當快速的,大多數遊戲一般都是設定在100Hz這樣。
隨著時間的推移,我不停地測試程式,回到Crash程式碼塊,並且修改載入/儲存程式碼,在訪問記憶體卡之前,把可程式設計時間定時調整到預設設定(100Hz),然後再將其調製1kHz,我們再也沒看到讀/寫問題。
為什麼,我反覆地思考和測試,並且不停地調整時間。有一天,我突然細微地觀察到了兩個東西,並且很容易重現:開始寫記憶體卡、操縱控制器、儲存卡損壞。這看起來就是個硬體Bug。
後來,我找到曾經設計過PS1的硬體工程師Connie,並且把發現的問題告訴她,她回答:“不可能”,並且我們進行了爭論,我想當場測試給她看,但是她覺得是在浪費時間,並且她為新專案忙地焦頭爛額。第二天,她向我道歉,並且告訴我,的確是一個硬體Bug。
圖片來源:《程式設計師雜誌》
Amir Memon:難以重現的Bug
Amir Memon是一名iOS軟體工程師,他分享了一個有關Bug難以重現的除錯經歷。
幾年前,微軟和Mozilla曾報導過Flash Player會出現崩潰的現象,然後我們卻無法重現這個崩潰,我們想從日誌中知道在哪裡崩潰,但毫無意義。後來,我們才知道,出於同樣的錯誤,有幾個崩潰記錄指向了不同的程式碼行。
最後,我們團隊裡的一個很棒的質量工程師追捕到了這個崩潰所在,並且能夠相當可靠地重現崩潰步驟,事實證明,只有在使用慢的硬碟驅動時才會發生。
該崩潰只會發生在一個視訊被銷燬後,Flash播放器破壞序列(比如在某些情況下,當你導航到另一個頁面的時候)。視訊檔案流沒有得到及時清除,隨之執行緒同步問題暴露出來。
之所以會提這個Bug,主要是因為它很難在一個系統內部重現,事實上,在程式崩潰的地方存在不少的多執行緒問題。最後,我修復了這個問題,並且很受歡迎。它阻止了成千上百萬個崩潰的發生。
各位程式設計師,你們遇到過最難忘/有趣的一次除錯經歷是什麼?或者你認為最難的一次除錯Bug是什麼呢?不妨分享一下哦。
來自:Quora
相關文章
- 記一次靈異般的 Bug 除錯經歷除錯
- 部落格園&阿里雲聯合徵文:最難忘的bug阿里
- 機器學習最困難的部分:超引數除錯機器學習除錯
- 13 年的 Bug 除錯經驗總結除錯
- Git 二分除錯法,火速定位疑難Bug!Git除錯
- 一次難忘的百度面試經歷(附電話面試題)面試題
- 曾夢想仗劍走天涯,現在卻因Bug想回家,揭秘程式設計師最難忘的那些Bug程式設計師
- 22 真機除錯bug(除錯包)除錯
- CISCO 9124光纖交換機除錯經歷除錯
- nodejs的除錯debugNodeJS除錯
- AS之Debug除錯除錯
- IsDebuggerPresent的反除錯與反反除錯除錯
- 經歷過有難度的面試題面試題
- 職業生涯中,最難以忘懷的誤操作 1
- DebugView 除錯入門View除錯
- Eruda 一個被人遺忘的除錯神器除錯
- [BUG反饋]除錯模式下函式U()的BUG除錯模式函式
- 昨日Oracle災難現場的經歷薦Oracle
- Windows windbg kernel debug 雙機核心除錯 - USB3.0 除錯 USB除錯 除錯線Windows除錯
- 除錯工具Firebug的使用方法除錯
- MySQL UDF的除錯方式 - debugview (轉)MySql除錯View
- 可以雙向除錯的debugger除錯
- Jmeter除錯工具---Debug SamplerJMeter除錯
- MyEclipse下debug除錯Eclipse除錯
- debug技巧之本地除錯除錯
- 除錯備忘錄-SWD協議解析除錯協議
- 記 storm-starter 在某知名 IDE 下的悲催除錯經歷ORMIDE除錯
- LLDebugTool – 便捷的IOS除錯工具(Version 1.1.5)iOS除錯
- LLDebugTool - 便捷的IOS除錯工具(Version 1.1.3)iOS除錯
- LLDebugTool - 便捷的IOS除錯工具(支援Swift)iOS除錯Swift
- LLDebugTool - 便捷的IOS除錯工具(Version 1.1.5)iOS除錯
- 一個有點深度的shell BUG除錯除錯
- win10系統debug怎麼除錯 win10電腦利用debug除錯的方法Win10除錯
- phpstorm + xdebug 斷點除錯PHPORM斷點除錯
- Laravel+xdebug 除錯問題Laravel除錯
- Laravel除錯利器 Laravel DebugbarLaravel除錯
- react + Laravel Debugbar API 除錯ReactLaravelAPI除錯
- Xcode Debug除錯彙總XCode除錯