設置斷點的原理是什么? 斷點調試

斷點調試(設置斷點的原理是什么?)
對于程序員來說,調試通常比編寫程序花費更長的時間 。尤其是對于像我這樣主要寫bug的程序員來說,一個好的調試器意味著早點下班休息 。現在有很多方便的調試器,包括著名的IDE如Visual Studio(VS)、免費的Windbg和GDB等 。添加斷點也很簡單,只需按鍵即可 。但是你有沒有想過調試器不能控制程序的執行順序,為什么能在需要的地方停止CPU?
今天,我們將揭開調試斷點的神秘面紗,并通過一個例子來看看調試器實際上做了什么 。調試器可以隨意停止程序的執行,主要是通過軟件斷點和硬件斷點 。
軟件斷點在X86系統中,軟件斷點為指令INT 3,其二進制代碼操作碼為0xCC 。當程序執行INT 3指令時,會造成軟件中斷 。操作系統的INT 3中斷處理程序將尋找在這個進程上注冊的調試處理程序 。所以像Windbg和VS這樣的調試器是有機會作弊的 。
讓我們舉個例子來看看調試器失敗了什么:
#include int main (){// This loop takes some time so that we// get a chance to examine the address of// the breakpoint at the second printffor (int i = 1; i100000000; i++) printf( Hello World! for資源網絡網 (int i = 1; i10000000; i++) printf( Hello World! return 0;}這是一個愚蠢的你好世界節目 。我們用Windbg打開它并設置一個斷點:
這時Windbg會把自己附加到程序的進程中,通過程序PE文件的調試部分找到調試信息 。在調試信息中找到斷點行所在的機器碼,使用WriteProcessMemory()函數將第一個字節替換為0xCC(INT 3) 。
讓我們驗證一下:
建議全屏打開,可能會更清晰 。
注意Windbg窗口在左邊,process視圖打開的process 空房間在右邊,左右紅框對應 。在我們設置斷點之前,左右內容完全相同 。這里要特別注意printf編譯的第一個二進制代碼0x68 。接下來,我們設置斷點并開始運行 。100萬張照片給了我們足夠的時間來看看發生了什么:
我們會發現推送操作碼0x68600e2900的第一個字節被0xCC替換,也就是INT 3被windbg替換 。所以windbg在這里執行時可以被調度 。
過了一會兒,嗦的斷點到了:
到達斷點時,運算符恢復為0x68 。似乎什么都沒發生,用戶被蒙在鼓里 。是不是很有趣?
事實上,一般來說,調試器維護一大組調試斷點,并用INT 3替換它們 。被調度回來后會被補回來,斷點由當前地址判斷 。軟件斷點的數量沒有限制 。
硬件斷點X86系統提供8個調試寄存器(DR0~DR7)和2個MSR用于硬件調試 。其中前四個DR0~DR3是硬件斷點寄存器,可以放入內存地址或IO地址,也可以設置執行、修改等條件 。當執行到這里,條件滿足時,CPU會自動停止 。
硬件斷點非常強大,但缺點是只有四個,這就是為什么所有調試器只能設置四個硬件斷點 。我們只能在調試不能修改的ROM時選擇這個,所以要節約使用 。一般來說,我們應該盡量選擇軟件斷點 。
還有INT 1單步調試命令,這里忽略 。
其他Visual Studio的一個有趣的特性是,調試后會在代碼的空間隙填充0xcc(INT 3),這樣一旦程序出界,就會被VS抓住,很容易發現錯誤 。0xCCCC在中國的GBK代碼是“熱” 。一些中國程序員在翻看內存中的代碼段時會發現很多燙手的地方 。不明所以認為發生了神奇的事情 。
一些越界的程序也會被燙傷:
有些用戶嚇得要死,以為電腦過熱,大喊熱,趕緊關機,很搞笑 。
版權聲明:【設置斷點的原理是什么? 斷點調試】本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人 。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任 。如發現本站有涉嫌抄襲侵權/違法違規的內容,請發送郵件至 2672143071@qq.com 舉報,一經查實,本站將立刻刪除 。

    推薦閱讀