2015-09-09 32 views
2

在俗語中,我知道關於斷點的用法,但想知道它究竟是如何工作的?它如何中斷執行代碼?它如何爲可執行代碼提供用戶界面(中斷點),以及爲什麼它通常只允許6箇中斷點。斷點如何工作?

謝謝!

+0

* 6 *來自哪裏? – meskobalazs

+0

@tom爲什麼絲毫不重要?它甚至不關心他們正在使用哪個調試器。談到斷點時,所有的CPU都以相同的方式工作。某些操作系統可能在調試器和CPU之間有一些絨毛API,但這是無關緊要的。 – Lundin

+1

[調試器如何工作?](http://stackoverflow.com/q/216819/995714) –

回答

14

調試器通常可以設置兩種不同類型的斷點:軟件斷點和硬件斷點。

軟件斷點包括用「break」指令(例如x86上的int 3)替換目標地址處的指令並等待CPU執行它。當該指令被觸發時,CPU產生一個異常並將控制轉移給調試器。好處在於,您可以根據需要定義多個斷點,但缺點是需要修改程序的內存(這可能不適用於只讀內存中的程序,或者可能導致程序的行爲不同讀取自己的程序存儲器)。

另一種硬件斷點包括在CPU中設置一個特殊的調試寄存器,讓它在遇到指定地址時斷開它。當程序計數器到達該地址時,CPU將自動產生一個異常。好處是不需要軟件修改,但缺點是這依賴於有限的資源(調試寄存器),其中可能沒有多少。例如,x86處理器通常只有4個調試地址寄存器,因此您一次只能設置4個硬件斷點。

調試器通常根據可用資源(例如前4個斷點和軟件斷點的硬件斷點)選擇策略,儘管也可以配置許多策略來強制某個特定類型的斷點。例如,流行的調試器GDB使用hbreak命令顯式創建硬件斷點。

+0

嗨nneonneo,謝謝你的迴應。實際上,我對調試和斷點有很多疑問,我主要關心的是軟件斷點......當程序計數器到達斷點時發生的過程如何發生。你能詳細解釋一下嗎? – VRU

1

這取決於處理器和操作系統。在Linux上,調試器正在使用系統調用,內核在處理器的某些硬件功能的幫助下執行該系統調用。