1. 程式人生 > >python軟體除錯斷點的概念、作用及其分類

python軟體除錯斷點的概念、作用及其分類

斷點是最常用的軟體除錯技術之一,其基本思想是在某一個位置設定一個“陷阱”,當CPU執行到這個位置的時候停止被除錯的程式並中斷到偵錯程式中,讓除錯者進行分析和除錯,除錯者分析結束後,可以讓被除錯程式恢復執行。通過設定斷點可以暫停程式執行,並可以觀察和記錄指令資訊、變數值、堆疊引數和記憶體資料,還可以深入瞭解和把握程式執行的內部原理和詳細過程,斷點對於軟體除錯具有重要的意義和作用。

斷點可以分為軟體斷點、硬體斷點和記憶體斷點三大類。

軟體斷點

軟體斷點是一個單位元組指令(INT 3,位元組碼為0xCC),可以在程式中設定多個軟體斷點,使得程式執行到該處時能夠暫停執行,並將控制權轉移給偵錯程式的斷點處理函式。

當偵錯程式被告知在目標地址設定一個斷點,它首先讀取目標地址的第一個位元組的操作碼,然後儲存起來,同時把地址儲存在內部的中斷列表中。接著,偵錯程式把一個位元組操作碼“0xCC”寫入剛才的地址。當CPU 執行到“0xCC”操作碼的時候就會觸發一個“INT 3”中斷事件,此時偵錯程式就能捕捉到這個事件。偵錯程式繼續判斷這個發生中斷事件的地址(通過指令指標暫存器EIP)是不是自己先前設定斷點的地址。如果在偵錯程式內部的斷點列表中找到了這個地址,就將設定斷點前儲存起來的操作碼寫回到目標地址,這樣程序被偵錯程式恢復後就能正常的執行。

硬體斷點

硬體斷點通過除錯暫存器實現,設定在CPU級別上,當需要除錯某個指定區域而又無法修改該區域時,硬體斷點非常有用。

一個CPU一般會有8 個除錯暫存器(DR0 暫存器到DR7暫存器),用於管理硬體斷點。其中除錯暫存器DR0到除錯暫存器DR3儲存硬體斷點地址,同一時間內最多隻能設定4個硬體斷點;DR4和DR5保留,DR6是狀態暫存器,說明被斷點觸發的除錯事件的型別; DR7本質上是一個硬體斷點的開關暫存器,同時也儲存了斷點的不同型別。通過在DR7暫存器裡設定不同標誌,能夠建立以下幾種斷點:當特定的地址上有指令執行的時候中斷、當特定的地址上有資料寫入的時候、當特定的地址上有資料讀或者寫但不執行的時候。
硬體斷點使用“INT 1”實現,該中斷負責硬體中斷和步進事件。步進是指根據預定的流程一條一條地執行指令,每執行完一條指令後暫停下來,從而可以精確地觀察關鍵程式碼並監視暫存器和記憶體資料的變化。在CPU每次執行程式碼之前,都會先確認當前將要執行程式碼的地址是否是硬體斷點的地址,同時也要確認是否有程式碼要訪問被設定了硬體斷點的記憶體區域。如果任何儲存在DR0-DR3中的地址所指向的區域被訪問了,就會觸發“INT 1”中斷,同時暫停CPU
;如果不是中斷地址則CPU執行該行程式碼,到下一行程式碼時,CPU繼續重複上面的過程。

硬體斷點使用“INT 1”實現,該中斷負責硬體中斷和步進事件。步進是指根據預定的流程一條一條地執行指令,每執行完一條指令後暫停下來,從而可以精確地觀察關鍵程式碼並監視暫存器和記憶體資料的變化。在CPU每次執行程式碼之前,都會先確認當前將要執行程式碼的地址是否是硬體斷點的地址,同時也要確認是否有程式碼要訪問被設定了硬體斷點的記憶體區域。如果任何儲存在DR0-DR3中的地址所指向的區域被訪問了,就會觸發“INT 1”中斷,同時暫停CPU;如果不是中斷地址則CPU執行該行程式碼,到下一行程式碼時,CPU繼續重複上面的過程。

記憶體斷點

記憶體斷點是通過修改記憶體中指定塊或頁的訪問許可權來實現的。通過將指定記憶體塊或頁的訪問許可權屬性設定為受保護的,則任何不符合訪問許可權約束的操作都將失敗,並丟擲異常,導致CPU暫停執行,使得偵錯程式可以檢視當前執行狀態。

一般來說,每個記憶體塊或頁的訪問許可權都由三種不同的訪問許可權組成:是否可執行、是否可讀、是否可寫。每個作業系統都提供了用來查詢和修改記憶體頁訪問許可權的函式,在Windows作業系統中可以使用VirtualProtect()函式來修改主調程序虛擬地址空間中已提交頁面的保護屬性,使用VirtualProtectEx()函式可以修改其他程序虛擬地址空間頁面的保護屬性。