1. 程式人生 > >軟體除錯基礎: 分類,除錯技術概覽

軟體除錯基礎: 分類,除錯技術概覽

分類:

軟體除錯有多種分類方法。

按除錯目標的系統環境分 - Windows下除錯,Linux下除錯,DOS下除錯等等。

按目的碼執行方式分 - 指令碼除錯(不需要編譯的語言),需要編譯的又分位倆種 - 1. 先編譯為中間程式碼,在執行時候再動態編譯成目的碼的,稱為託管除錯,2. 直接編譯和連結成目的碼的,稱為本地除錯。兩種混合起來i一起除錯的叫混合除錯。

按目的碼執行模式分 - 使用者態除錯, 核心態除錯。

按偵錯程式跟除錯目標的相對位置分 - 本地除錯,遠端除錯。

按除錯目標的活動性分 - 活動目標除錯,轉儲檔案除錯(Dump檔案)。

按除錯工具分 - 使用偵錯程式的軟體除錯,不使用偵錯程式的軟體除錯。

除錯技術概覽

1. 斷點

幾種分類,

根據斷點的設定空間分:

程式碼斷點:設定在記憶體空間,地址是某一段程式碼的起始處。

資料斷點:設定在記憶體空間,地址是要監視資料的起始地址。

I/O斷點:設定在I/O空間,地址為某一個I/O地址。當程式訪問指定I/O埠的時候中斷到偵錯程式。跟資料斷點一樣,都可以設定觸發時候的訪問寬度。

根據斷點設定方法分:

軟體斷點:向指定的程式碼位置插入專用的斷點指令,比如INT 3。

硬體斷點:通過設定CPU的除錯暫存器來設定。IA32 CPU定義了8個除錯暫存器,DR0-DR7,可以同時最多設定4個硬體斷點(對於一個除錯會話)。通過硬體斷點可以設定任意的設定空間的斷點,但是斷點指令只能設定程式碼斷點。

當中斷到偵錯程式時,系統或者偵錯程式會將被除錯程式的狀態儲存到一個數據結構中,稱為上下文context

追蹤點tracepoint是斷點的一種衍生形式。基本思路是當設定一個追蹤點時,偵錯程式內部會當作特殊的斷點來處理。當執行到追蹤點的時候,系統會向偵錯程式報告斷點事件,在偵錯程式收到後,會檢查內部維護的斷點列表,發現目前發生的是追蹤點後,便執行這個追蹤點所定義的行為,通常是列印提示資訊和變數值,然後直接恢復被除錯程式執行。所以除錯者感覺不到被除錯程式中斷到偵錯程式的過程。

條件斷點: 當用戶設定了一個條件斷點時,偵錯程式實際插入的還是無條件斷點,在斷點命中,偵錯程式收到除錯事件後,偵錯程式會檢查這個斷點的條件,如果滿足就中斷,否則恢復被除錯程式。

2. 單步執行

分為單步指令,單步程式碼句,單步分支和單步任務(多執行緒使用)。

3. 輸出除錯資訊

列印和輸出除錯資訊是簡單而古老的軟體除錯方法,基本思想是用程式碼把資訊以文字的形式輸出到一個可觀察的地方比如控制檯,視窗,檔案,或者偵錯程式。

優點:簡單方便,不依賴於偵錯程式跟複雜的工具。

缺點:需要新增程式碼,影響執行效率,資訊有限,容易洩漏程式技術細節。

在Windows系統中,驅動程式可以使用DbgPrint/DbgPrintEx來輸出除錯資訊,應用程式可以使用OutputDebugString,控制檯程式可以使用print函式來列印。

4. 日誌

與輸出除錯資訊類似,基本思想是編寫程式的時候加入特定的程式碼將程式執行狀態資訊寫到日誌檔案或者資料庫。Windows系統提供了基本的日誌記錄,觀察和管理功能Event Log。

5. 事件追蹤

3跟4都是以文字形式的,不適合處理資料龐大且速度要求高的情況。事件追蹤機制Event Trace正是針對這個需求設計的, 它使用二進位制形式來記錄資料,觀察時再轉化成問基本形式。適用於監視訊繁且複雜的軟體過程,比如監視檔案訪問,網路通訊等。ETW (Event Trace for Windows)是Windows內建的一種,很多WINDOWS下的工具比如TCPIPView都使用了該機制。

6. 轉儲檔案

轉儲檔案用於將發生問題的時候系統狀態像拍照片一樣儲存下來,分為小,中,大幾種規格,最小的叫Mini Dump。WINDOWS S提供了為應用程式和整個系統產生轉儲檔案的機制,可以在不停止程式或者系統執行的情況下生成轉儲檔案。

7. 棧回溯

目前主流CPU架構都是使用棧來進行函式呼叫的,棧上記錄了函式的返回地址,因此通過遞迴尋找放在棧上的函式返回地址,就可以找到當前執行緒的函式呼叫序列,產生

call stack。因為返回的只是地址,所以可以通過除錯符號檔案symbol將返回地址翻譯成函式名。

8. 反彙編

將目的碼翻譯成彙編程式碼。有很多工具,比如IDA, interactive disassembler。