除錯斷點的實現原理

2021-05-10 04:35:48 字數 614 閱讀 3441

前幾天在公司,突然和****n同學討論起編譯器是如何實現除錯斷點的,這下才突然意識到,每天程式設計在除錯的時候都會去設斷點,但從來沒有思考過編譯器或者作業系統式如何實現程式的除錯斷點的,於是我們展開了討論。

首先,我們覺得,不大可能是在目標程式裡插入了**,因為這個斷點我們可以隨時設定或取消,如果是在生成程式或者在作業系統引導程式時插入了除錯**的話做不到這一點。

然後我們又否定了作業系統不可能動態的在程序裡插入除錯跳轉命令,因為乙個程式被作業系統載入記憶體以後,程式中的跳轉命令的跳轉位址就已經確定了,如果這時候作業系統再插入一些除錯命令的話,那些跳轉指令就會錯了。

這時,我提出,或許作業系統提供了一些暫存器,裡面存了除錯斷點的位置,這樣作業系統在每執行一條命令(或者一組原子命令)以後就檢視一下是否到了斷點的地方,再確定是跳轉到除錯程式還是繼續執行。

於是我們上網查了一下,果然被我猜中了,原來intel 的80x86 cpu提供了幾個暫存器用於軟體除錯,他們是:dr0 … dr7,其中dr4和dr5保留不用,只能用6個。

這樣看來,既然硬體提供了對應暫存器,他們一定也會對此進行一些硬體上的優化,使得每次判斷是否跳轉這個過程盡可能的快,避免對效能造成的損失。

最後,一句話總結一下就是,除錯斷點是通過除錯暫存器實現的。

斷點續傳實現原理

零 斷點續傳 簡述原理 斷點續傳說白了就是將乙個檔案按照一定的規則人為的分割成多個小檔案,然後客戶端每次只上傳乙個小檔案 當然我們也可以利用多執行緒技術每次上傳多個小檔案 伺服器接收到上傳過來的小檔案後根據一定的規則來組合這些小檔案。如果在上傳過程 現網路中斷等意外情況,下次再次上傳時可以從已經上傳...

GDB GDB的斷點除錯

那麼我們應該如何使用gdb呢?gdb為我們提供了什麼樣的功能呢?我們可以參照圖形介面偵錯程式的基本功能,使用gdb來實現。例如 問題 我們如何使用gdb設定斷點,刪除斷點的操作?通過函式名設定斷點 1.break func name if var value 2.tbreak func name i...

PHP 斷點除錯

我使用的xamp 搭建的的php整合環境。預設情況下,xamp沒有開啟xdebug功能,但是x debug dll及配置檔案均已寫入php.ini 中了。1.啟用x debug php.ini 去掉1008行注釋 zend extension d program files xampp xampp ...