標籤:調試 異常處理 簡單調試器 windows
簡單調試器項目中on開頭的函數為接收系統的調試事件並做相應的處理,簡單調試器實現過程中主要的調試事件為例外狀況事件,相應的處理函數為DispatchException。
在例外狀況事件中訪問異常、int3異常、單步異常是跟實現調試器功能密切相關的例外狀況事件,這裡用三個函數分別處理三個函數分別為OnExceptionAccess、OnExceptionBreakPoint、OnExceptionSingleStep。
異常處理函數中如果為調試器自己設定的異常程式就會停下來接收使用者輸入等待下一步處理,相應的使用者互動函數為UserInput。
在於使用者互動的過程中程式是通過一些列以Cmd開頭的命令函數完成相應的功能。
斷點相關:
int3斷點相關:
int3斷點分為臨時斷點和永久斷點,設定斷點時如果永久斷點與臨時斷點重複需要把已經存在的臨時斷點轉換為永久斷點,其他斷點重複的情況不需再次設定斷點
臨時斷點使被偵錯工具中斷以後,需要恢複被偵錯工具斷點為原值,並把該臨時斷點刪除。
永久斷點使被偵錯工具中斷以後,需要暫時恢複被偵錯工具斷點為原值,然後配合逐步執行過該永久斷點,在單步異常中再次設定該永久斷點。
刪除斷點把被偵錯工具斷點恢複為原值,然後刪除該斷點
記憶體斷點相關:
記憶體斷點分為寫入斷點和訪問斷點,通過修改被偵錯工具記憶體屬性為不可訪問,然後在訪問例外狀況事件中處理記憶體斷點。
設定記憶體斷點,本程式限制記憶體斷點長度不能超過一個分頁,本程式會檢測設定的記憶體斷點是否跨記憶體分頁,如果跨記憶體分頁則自動把該斷點拆分為兩個不跨分頁的記憶體斷點。
因為記憶體訪問屬性包含記憶體寫入屬性,所以在設定記憶體斷點時如果和之前已經存在的記憶體斷點有重疊地區該程式提示使用者佈建斷點失敗。
本程式用map記錄修改的記憶體分頁起始地址以及對應的記憶體分頁原屬性。
設定新記憶體斷點時尋找map中該記憶體分頁是否已經存在其他記憶體斷點,如果存在只需添加該記憶體斷點帶記憶體斷點表,如果不存在則修改該記憶體分頁屬性並存入map,然後添加該記憶體斷點進入記憶體斷點表
被偵錯工具發生訪問異常時首先查詢是否命中map中的記憶體分頁,沒有命中說明是程式自身的異常不做處理,如果命中map中的記憶體分頁,首先暫時恢複該記憶體分頁為原來的屬性,然後繼續尋找記憶體斷點表看是否命中具體的記憶體斷點,如果命中具體的記憶體斷點表,提示使用者,沒有命中具體的記憶體斷點,偵錯工具單步走過該訪問異常,然後在單步事件中恢複記憶體分頁屬性。
刪除記憶體斷點:
首先刪除該條記憶體斷點,然後尋找記憶體斷點表,尋找是否存在與刪除記憶體斷點在同一記憶體分頁上的其他記憶體斷點,如果記憶體斷點中不存在與刪除記憶體斷點在同一分頁的斷點,尋找map中對應的記憶體分頁,恢複該記憶體分頁屬性為原值,刪除掉map中該記憶體分頁記錄,如果還存與刪除記憶體斷點在同一分頁的記憶體斷點,則不對map做處理。
硬體斷點相關:
設定硬體斷點,在單步異常中判斷是否為硬體斷點異常,如果命中硬體斷點提示使用者,命中硬體斷點的情況下設定單步,在單步異常中恢複硬體斷點。
附件中好像沒有顯示源碼源碼可以在這裡下載:
http://download.csdn.net/detail/qihuanfengyun/8351005
windows簡單調試器源碼2700行左右代碼