如何有效地調試軟體

點擊數: 【字體: 列印文章 查看評論

  Diomidis Spinellis是《代碼閱讀與代碼質量》一書的作者。在GOTO阿姆斯特丹2016大會上,他就如何有效地調試軟體和預防錯誤做了演講。

  InfoQ採訪了Spinellis,內容涉及發現和修復軟體中的錯誤、軟體調試的原則、如何提高調試效率、如何編寫出不怎麼需要調試的代碼以及管理人員如何為錯誤預防和處理提供支持。

  InfoQ:是什麼讓軟體錯誤的發現和修復如此困難?

  Diomidis Spinellis:如果你認為編寫代碼困難,那就嘗試下代碼調試吧。你編寫了一個新的函數或方法,並加上一些語句形成某個只是貌似正確的東西。當你調試一個程序的時候,你要面對數千或數百萬行貌似正確的代碼,並設法找出其中的錯誤。這必定要困難許多。然後,你還要應對各種系統和層次之間的複雜交互、每秒執行數十億次的CPU指令、難以再現的Bug以及來自生產環境系統的壓力。

  而且,課堂上很少教調試;從一切可能出錯的東西辛苦得來的經驗很難壓縮到一次演講中。此外,由於系統失敗的方式各不相同,你必須不斷地改進和調整你所用的工具和方法。你可以從觀察開始,繼之以數據分析,然後做一些試驗,最後推斷出Bug的原因。沒有什麼標準的初學者技能。

  InfoQ:軟體調試有什麼一般原則嗎?

  Spinellis:很遺憾,由於軟體會出現各種難以想象的錯誤情況,我不認為有什麼可以在軟體調試過程中遵循的一般原則。退而求其次,我歸納出了三大類方法:

  高級策略,比如由故障特徵推斷出原因,或者確保某些代碼滿足了其前提條件;

  方法和實踐,比如確保Bug可以有效地再現,或者著重突出故障的影響;

  通用工具,比如Unix命令行工具、跟蹤(考慮下strace、dtrace和systemtap)工具和版本控制系統。

  InfoQ:程序員做什麼能夠提高調試效率?

  Spinellis:首先要為調試成功做好準備。讓自己相信問題將會得到解決,留出足夠的時間用於調試,不要分心,要堅持不懈,必要的時候,留待第二天解決。重要的是,要不斷地在環境、工具和知識上投入。購買高效工作所需的軟體和硬體。例如,如果軟體生成大量的調試日誌文件,你就應該有足夠的磁碟空間、CPU處理能力和帶寬,以便可以高效地處理它們。在調試的過程中,你很容易遇到千奇百怪的問題,因此,花些精力管理和優化自己的環境和工具配置。這包括按鍵綁定、別名、輔助腳本、快捷方式和工具配置;所有這些都可以顯著地提高調試生產力。

  InfoQ:有什麼技術或方法可以編寫出不怎麼需要調試的代碼嗎?

  Spinellis:當然!編寫可維護的代碼——可讀、穩定、易於分析和修改的代碼——帶來的Bug也比較少。此外,像單元測試、代碼審查這樣的方法以及使用斷言都有助於最小化進入生產環境的錯誤。

  在設計時使用高級抽象(例如使用一個框架的演算法或容器數據結構,而不是選擇自己開發一種方案)可以減少代碼和錯誤。另外,讓程序易於調試也很重要。這包括為詳細地記錄日誌提供便利,當出現內部錯誤時報告豐富的上下文信息,並將問題及崩潰的詳細信息發送到一個中央存儲庫。

  InfoQ:管理人員如何為組織里的錯誤預防和處理提供支持?

  Spinellis:設定基本的過程有助於確保軟體錯誤不會失控。部署並採用一個問題跟蹤系統,用它把要處理的問題分類並排定優先順序。將軟體變更恰當地記錄在進一個運作良好的版本管理系統里,並將它與問題跟蹤系統聯繫起來;我經常僅僅通過仔細研究一個文件的歷史和變更就修復了Bug。在軟體建設方面,推廣單元測試的應用,把軟體的構建性能分析、靜態分析和動態分析包含進來,並維護一個快速、精益、均衡的構建-測試周期。這有助於幫助開發人員儘早捕獲Bug,並迅速修復。最後,在運維方面,逐步部署軟體,允許新舊版本對比,努力確保所使用的工具和所部署的環境的多樣性,並有組織地升級工具和庫。
 


關於我們 |  站點地圖 |  聯繫方式 |  投稿指南 |  廣告服務 

Copyright © 2005 dn580.com Inc. All rights reserved. 永乐国际 版權所有

手機:15871451580 郵編:430000 EMail:fuanping@163.com

鄂ICP備12003384