關於gdb斷點的真相

查志強發表於2014-06-08

【原文:http://blog.csdn.net/wwwsq/article/details/7161238

gdb的斷點是基於訊號(signal)實現的

在某個地址增加一個斷點,實際上就是修改那個地址的程式碼,把原來的程式碼替換成INT 3指令,同時讓gdb捕獲這個signal並做相應的處理:包括執行被替換掉的指令,並跳轉回來。

因此,只要斷點不被走到,那麼斷點就不會影響程式的執行效率;因為程式的其他地方都沒改變,該怎麼執行還是怎麼執行。


gdb在遇到斷點之後可以做很多事情

包括:

停下來等使用者處理

自動繼續

自動執行一些gdb指令(用commands命令可以配置斷點的自動執行)

判斷條件是否要停下來(這就是大名鼎鼎的條件斷點)


在走到斷點之後,不管是路過還是停下來,都會影響效能

因為通常到了斷點就會通過INT3停下來。

只是條件斷點有點特別,它分為軟體和硬體兩種。這是因為條件斷點這個需求太普遍了,因此有人就想了一個辦法從硬體支援一部分:在x86平臺,某些條件斷點可以不插入INT 3,而是插入一個其他指令,當程式走到這個地址的時候,並不是直接發出INT 3訊號,而是先去比較一下特定暫存器和某個地址的內容,再決定要不要INT 3。

如果能採用硬體條件斷點,會比軟體條件斷點的效能好很多。搜尋‘硬體斷點寄 存器’會找到更多資訊。


相關文章