我正在學習一些機制的斷點,並且我瞭解到'在x86中,存在調試器中斷CPU的指令int3
。然後CPU將通過signal
'中斷正在運行的程序。在gdb中設置一個隨機地址斷點
例如:
8048e20: 55 push %ebp
8048e21: 89 e5 mov %esp,%ebp
當用戶輸入
b *表0x8048e21
該指令將由int3
被替換(操作碼0xcc
)和成爲這樣:
8048e20: 55 push %ebp
8048e21: cc e5 mov %esp,%ebp
它會停在正確的地方。
貴不貴:如果我設置斷點不是在指令的開始
會發生什麼?也就是說,如果我輸入:
B * 0x8048e22
將Debugger仍取代e5
與cc
?所以我寫了一個簡單的例子,並用gdb運行它。
正如你在上面看到的,我設置了兩個斷點,第二個斷點處於中間位置。 I輸入r
並在第一個斷點處停止並輸入c
並運行到最後。
所以看起來gdb忽略了第二個斷點。 (因爲如果它真的用int3
來代替它,程序將是完全錯誤的)。
問:什麼發生在第二個斷點,更具體地說,什麼是GDB處理它(或者是我學習的是錯了嗎?)
編輯: @dbrank已經給出關於改變一個很好的例子一個指令的數據字段,我會試着用一個類似的例子使它更全面(似乎是寄存器)。 (約斷點的機制中的任何附圖理解!)
我試過你的例子,但我的程序輸出原始數據?有任何想法嗎? – Tony
上面的例子是爲-m32標誌編譯的(對於x86)。在x86_64編譯的代碼有點不同,你需要在不同的位置放置一個斷點(用斷點覆蓋原始值0x2a)。 – dbrank0
對不起,這麼晚迴應,你的例子確實有效。感謝您的指導。 – Tony