最難忘的Bug除錯經歷

csdn發表於2013-11-07

  相信每位程式設計師都有過一段不堪回首地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。

最難忘的Bug除錯經歷

圖片來源:《程式設計師雜誌》

  Amir Memon:難以重現的Bug

  Amir Memon是一名iOS軟體工程師,他分享了一個有關Bug難以重現的除錯經歷。

  幾年前,微軟和Mozilla曾報導過Flash Player會出現崩潰的現象,然後我們卻無法重現這個崩潰,我們想從日誌中知道在哪裡崩潰,但毫無意義。後來,我們才知道,出於同樣的錯誤,有幾個崩潰記錄指向了不同的程式碼行。

  最後,我們團隊裡的一個很棒的質量工程師追捕到了這個崩潰所在,並且能夠相當可靠地重現崩潰步驟,事實證明,只有在使用慢的硬碟驅動時才會發生。

  該崩潰只會發生在一個視訊被銷燬後,Flash播放器破壞序列(比如在某些情況下,當你導航到另一個頁面的時候)。視訊檔案流沒有得到及時清除,隨之執行緒同步問題暴露出來。

  之所以會提這個Bug,主要是因為它很難在一個系統內部重現,事實上,在程式崩潰的地方存在不少的多執行緒問題。最後,我修復了這個問題,並且很受歡迎。它阻止了成千上百萬個崩潰的發生。

  各位程式設計師,你們遇到過最難忘/有趣的一次除錯經歷是什麼?或者你認為最難的一次除錯Bug是什麼呢?不妨分享一下哦。

  來自:Quora

相關文章