引言
本文摘錄《Effective Debugging中文版》一書的要點。內文摘錄
chapter 01 高階策略
作法 01 透過問題記錄系統處理所有問題
☛以問題記錄系統處理所有問題☛確保每個問題有精確簡短與完整的如何複製說明
☛根據問題的優先順序與嚴重性分類與安排工作程序
☛透過系統記錄你的進度
作法 02 以精確的關鍵字上網查詢問題的線索
☛以雙引號包圍錯誤訊息執行搜尋☛StackExchange網站群的答案很有幫助
☛如果以上方式均無效,張貼你的問題或登錄一項問題
作法 03 確認滿足前後條件
☛仔細檢查程序的前置條件與後置條件作法 04 從問題向上到錯誤或從程式的開始向下到錯誤
☛能夠清楚識別原因,例如當掉、凍結與有錯誤訊息時,從下向上進行☛難以識別原因,例如效能、安全性與可靠性時,從上至下進行
作法 05 找出新舊系統間的差異
☛比較正常的系統與有問題的系統以找出失敗的成因☛考慮所有會影響系統行為的元素:程式碼、輸入、呼叫參數、環境變數、服務與動態連結函式庫
作法 06 使用軟體的除錯設施
☛認識要除錯的軟體有提供什麼除錯設施並使用它們來調查作法 07 建構與執行環境的多元化
☛多樣化的編譯與執行平台能夠提供很有價值的除錯洞見☛以高階語言的實作來改正複雜的演算法
作法 08 專注於最重要的問題
☛並非所有問題都值得解決☛解決低優先問題會佔用處理高優先問題的時間
chapter 02 通用方法與實踐
作法 09 讓自己準備好
☛相信問題可以找到並解決☛為除錯工作保留足夠時間
☛排除干擾
☛遇到困難睡一下
☛不要放棄
☛投資環境、工具與知識
作法 10 有效的重複產生問題
☛複製簡化除錯程序☛建構複製錯誤的完整小範例
☛使用可複製執行環境的機制
☛使用版本控制系統標示與讀取軟體的版本
作法 11 減少來回修改的時間
☛快速的來回可提升效率☛設置自動化建構與部署程序
☛減少測試失敗所需的時間
作法 12 複雜測試場合的自動化
☛使用腳本語言將複雜測試案例的執行自動化作法 13 展示你的除錯資料
☛視野中的大量資料可以讓你更專注並找出模式與關聯☛使用最大顯示區域
☛列印出相關的靜態資料
作法 14 更新你的軟體
☛在更新過的環境測試有問題的系統☛不要期望太高
☛考慮第三方軟體有問題的可能
作法 15 參考第三方原始碼
☛取得你所使用的第三方程式的原始碼☛檢視原始碼來探索第三方API與錯誤訊息
☛連結除錯版函式庫
☛沒有其他辦法時才修改第三方程式
作法 16 使用專用監控與程式設備
☛邏輯、通道或協定分析儀可幫料你找出硬體層級發生的問題☛土方法或許可以幫助你調查與硬體相關的問題
☛以Wireshark與Ethernet集線器、交換器或命令列工具監控網路封包
作法 17 放大失敗的效應
☛強制執行有問題的路徑☛放大某些效應以突顯它們
☛對你的軟體施加壓力以讓它脫離舒適圈
☛在版本控制下執行修改
作法 18 從你的桌面對遠端系統除錯
☛設置裝置的模擬器以讓你使用你的工作站的螢幕與鍵盤進行除錯☛使用軟體在你的工作站上以原生工具對嵌入程式碼除錯
☛對客戶的電腦安排遠端存取
☛設置KVM over IP裝置對遠端伺服器除錯
作法 19 除錯任務自動化
☛將全面搜尋自動化;電腦的時間比你的時間便宜作法 20 除錯前後的清理工作
☛進行除錯工作前要確保基本的程式整潔☛完成後要清理臨時的修改並保存有用的修改
作法 21 修理有問題類別的所有實例
☛改正一個問題後,找出並改正類似的問題且要採取步驟來確保未來不再發生chapter 03 通用工具與技巧
作法 22 以 Unix 命令列工具分析除錯資料
☛使用可以取得、選取、處理與統計文字記錄的Unix命令來分析除錯資料☛以管道組合Unix命令可讓你快速的完成複雜的分析工作
作法 23 使用命令列工具選項
☛grep的各種選項可以幫助你縮小搜尋範圍☛將程式的標準錯誤重新導向以便進行分析
☛使用tail -f監控會新增資料的日誌檔案
作法 24 以編輯器探索除錯資料
☛使用編輯器的搜尋功能找出打字錯誤☛編輯文字以突顯差異
☛編輯日誌檔案以提升可讀性
作法 25 工作環境最佳化
☛適當的設定工具以提升你的生產力☛在主機間以版本控制系統共用環境設定
作法 26 以版本控制系統追獵錯誤的成因與歷史
☛以版本控制系統檢視檔案歷史可顯示問題是如何發生的☛使用版本控制系統檢視正確與失敗版本的軟體間的差異
作法 27 使用系統的獨立行程監控工具
☛設置監控設施來檢查組成服務的各個部分☛快速通知可讓你在系統處於失敗狀態時進行除錯
☛使用歷史記錄來識別模式可幫助你找出問題的成因
chapter 04 除錯技巧
作法 28 使用符號除錯編譯的程式
☛設定建構以取得需要的除錯資訊☛關閉編譯器最佳化以讓產生的碼與要除錯的程式相符
作法 29 逐步執行程式
☛逐步執行程式以檢視執行序列與程式的狀態☛跨過不相關的部分以加速檢視
☛設定中斷點以縮小範圍,重複執行並跨入關鍵程序
作法 30 使用程式與資料中斷點
☛以程式中斷點縮小程式範圍☛加入中斷點以略過不相關的執行
☛中斷例外或結束程序以對異常終結除錯
☛從除錯工具停止程式的執行來解決當機
☛以資料中斷點找出變數異常的改變
作法 31 熟悉反向除錯
☛熟悉反向除錯作法 32 沿著程序間的呼叫
☛檢視程式的堆疊以了解它的狀態☛搞亂的堆疊是程式的問題產生的
作法 33 檢視變數與表達式的值以找尋錯誤
☛檢查重要表達式的值☛設置連續顯示執行演算法時會變化的表達式
☛透過其區域變數追蹤程序的邏輯
☛使用資料視覺化設施零處理複雜的資料結構
作法 34 知道如何將除錯工具附在行程上
☛對執行中的行程可將除錯工具附上以進行除錯☛透過遠端除錯設施對資源受限裝置上的應用程式進行除錯
作法 35 認識如何使用核心傾印
☛取得並檢視當掉與凍結的應用程式的記憶體傾印來進行除錯☛設定當機報告系統以對客戶端的應用程式除錯
作法 36 調校你的除錯工具
☛使用圖形介面除錯工具☛設定gdb儲存歷史與使用你偏好的鍵盤組合
☛將常用命令放在gdb腳本中
☛在gdb中建構你的程式以維護你輸入的命令
作法 37 認識如何檢視組合語言程式碼與原始記憶體
☛想要確實了解程式的行為,檢視分解後的機械指令☛暫存器eax或r0可以告訴你函式的回傳值
☛想要確實了解資料如何儲存,檢視它的內部表示方式
chapter 05 程式設計技巧
作法 38 審核與手動執行可疑程式碼
☛找尋程式中的常見錯誤☛手動執行程式以檢驗其正確性
☛畫圖以處理複雜的資料結構
☛以大張紙、白板與顏色解決複雜性
☛操作實體物件來強化與問題的接觸
作法 39 與同僚一起檢視你的程式碼
☛對小鴨解釋你的程式☛實踐程式碼審查
☛透過角色扮演對多方問題除錯
作法 40 加入除錯功能
☛對你的程式加上進入除錯模式的選項☛加上命令來操控程式的狀態、記錄它的操作、減少執行期複雜性、使用者介面捷徑與顯示複雜的資料結構
☛加上命令列、網頁與序列介面來對嵌入裝置與伺服器除錯
☛使用除錯模式命令來模擬外部失敗
作法 41 加入日誌記錄陳述
☛加入記錄陳述以設置受維護的除錯基礎建設☛使用記錄平台架構而不要重新發明輪子
☛透過記錄平台架構設定要記錄的主題與細節
作法 42 使用單元測試
☛使用單元測試探索可疑的程序以找出缺陷☛使用單元測試平台、重構程式與適合測試、自動化測試工作以提升效率
作法 43 使用斷言
☛以斷言補足單元測試來更精確的找出問題的位置☛以斷言對複雜的演算法除,檢驗它的前置條件、後置條件與不變性
☛以斷言說明你對程式的理解並測試你的猜測
作法 44 擾動程式以檢驗你的推論
☛手動設置程式中的值以識別正確與錯誤值☛如果找不到程式的正確說明,嘗試其它實作方式
作法 45 將可行與失敗程式間的差異最小化
☛要找出導致失敗的元素,逐步的修改程式以符合可行的範例或讓範例符合你的程式作法 46 簡化可疑程式
☛選擇性的刪除大區塊程式以突顯問題☛拆解複雜的陳述或函式以個別的監控與測試它們的功能
☛考慮以簡單的演算法取代複雜的有問題演算法
作法 47 以其他語言重寫可疑的程式
☛以更具表達性的語言重寫改不好的程式來減少有問題的陳述的數量☛將有問題的程式轉換到更好的程式設計環境以強化你的除錯工具
☛替代方案可行時,採用它或使用它來修改原來的程式
作法 48 改善可疑程式碼的易讀性與結構
☛以一致的方式格式化程式以讓你以肉眼捕捉錯誤模式☛重構程式以顯露出隱藏在沒寫好或過度複雜的程式結構中的錯誤
作法 49 治本而非治標
☛絕對不要為錯誤的症狀寫程式:找出問題並加以改正☛可能的話,將複雜問題以通用方式解決而不要修改特殊狀況
chapter 06 編譯期技巧
作法 50 檢視產生的程式碼
☛檢視自動產生的程式碼可以認識原始碼中的編譯與執行期問題☛使用編譯器選項或特殊工具來取得可讀的自動產生程式碼
作法 51 使用靜態程式分析
☛專用的靜態分析工具比編譯器警告可識別更多潛在的錯誤☛設定編譯器來分析程式的錯誤
☛在建構與整合循環中引入至少一個靜態分析工具
作法 52 設定決定性建構與執行
☛設定建構程序與軟體執行以做到可複製的執行作法 53 設定使用除錯函式庫
☛使用你的環境中的編譯器與函式庫所提供的執行期除錯支援☛如果沒有可用的支援,考慮設定你的軟體使用有提供支援的第三方函式庫
chapter 07 執行期技巧
作法 54 建構測試案例以找出問題
☛建構可靠的測試案例的過程可讓你找到錯誤與其解決方案☛在軟體中嵌入測試案例作為單元或廻歸測試
作法 55 盡快失敗
☛除錯時,設定觸發機制讓你的程式一出現問題症狀就失敗作法 56 檢視應用程式日誌檔案
☛從檢視日誌檔案開始調查失敗的應用程式☛提高應用程式的日誌層級以記錄失敗的原因
☛設定與過濾日誌檔案以找出問題
作法 57 系統與行程操作的側寫
☛觀察CPU、I/O與記憶體使用率以及飽和度來分析效能問題☛以行程的CPU與記憶體使用狀況的側寫縮小與效能問題有關的程式的範圍
作法 58 追蹤程式執行
☛系統與函式庫呼叫追蹤能讓你監控程式的行為而無須存取它的原始碼☛學習如何使用Windows Performance Toolkit (Windows)、SystemTap (Linux)或DTrace (OS X、Solaris、FreeBSD)
作法 59 使用動態程式分析工具
☛使用動態程式分析工具來找出實際在程式中發生的問題chapter 08 多執行緒程式除錯
作法 60 以剖析除錯分析死結
☛取得打死結程式的快照並找出等待資源的程式與執行緒以對死結除錯作法 61 擷取與複製
☛擷取失敗執行、分析記錄、並從除錯工具重播擷取檔案以找出非決定性的並行錯誤作法 62 以專用工具找出死結與競爭狀況
☛以靜態分析工具梳理多執行緒程式以找出潛在的同步化與上鎖錯誤☛在動態分析工具下執行多執行緒程式以找出API誤用、潛在死結與資料競爭
作法 63 隔離與移除不確定性
☛隔離並行程式與其餘部分。這樣能讓你對每個部分使用最合適的除錯工具與技巧☛建構測試與除錯組態讓模擬物件與其他技巧使得程式的行為可以預期。這可提供可重複的程式執行
沒有留言:
張貼留言