兩種追蹤方向#
定位問題來源通常有兩條路:從問題的表現處往上追 (bottom-up),或從系統的頂端往下追 (top-down)。根據問題類型,其中一種通常比另一種更有效率。如果一條路走到死胡同,就換另一個方向。
由下往上 (Bottom-Up):從問題的表現處出發#
當問題有明確的表現跡象時,由下往上追蹤最為合適。有三種常見情境:
程式崩潰 (Program Crash)#
- 在 debugger 中執行程式,或在崩潰後 attach debugger,或取得 memory dump
- 檢查崩潰點的變數值,尋找
null、損壞或未初始化的值 - 某些系統可透過特徵 byte pattern 辨識未初始化值(如
0xBAADF00D) - 沿著 call stack 往上追,檢查不正確的參數
- 如果找不到原因,在可疑的計算點設置 breakpoint,逐步向上追蹤
程式凍結 (Program Freeze)#
- 在 debugger 中執行或 attach debugger,然後中斷執行
- 沿 call stack 往上移動,找到造成凍結的迴圈
- 檢查迴圈的終止條件,理解為何它永遠無法滿足
錯誤訊息 (Error Message)#
- 在原始碼中搜尋錯誤訊息文字(
fgrep -r是好幫手) - 注意:在本地化軟體中,搜尋可能會定位到翻譯檔案(如
.po檔)而非程式碼本身
#: ../share/extensions/gimp_xcf.py:43
msgid "An error occurred while processing the XCF file."
msgstr "Ha ocurrido un error al procesar el archivo XCF."- 從翻譯檔案找到程式碼位置,在錯誤訊息出現前設置 breakpoint 或 log
搜尋非 ASCII 文字時,確保 command-line 的 locale 設定與原始碼的編碼一致(如 UTF-8)。
由上往下 (Top-Down):從系統頂端出發#
當你無法明確定位與失敗相關的程式碼時,由上往下追蹤更合適。這通常是所謂的 emergent properties(浮現特性)——你無法將問題歸因於某個特定部分。例如:
- 效能問題:軟體太慢或佔用太多記憶體
- 安全問題:網頁被竄改
- 可靠性問題:服務無法提供預期功能
由上往下的做法是將整體分解為各個部分,逐一檢查每個部分對問題的貢獻。例如:
- 效能問題使用 profiling 工具
- 安全問題檢查 buffer overflow、code injection、XSS 等常見漏洞
- 可靠性問題逐一檢查 web service 的內外部依賴
重點回顧#
- 當失敗有明確的可辨識原因(如 crash、freeze、error message)時,採用由下往上的方式
- 當失敗難以明確定位(如效能、安全、可靠性問題)時,採用由上往下的方式