2014-12-25 47 views
1

我正在學習一些機制的斷點,並且我瞭解到'在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仍取代e5cc?所以我寫了一個簡單的例子,並用gdb運行它。 enter image description here

正如你在上面看到的,我設置了兩個斷點,第二個斷點處於中間位置。 I輸入r並在第一個斷點處停止並輸入c並運行到最後。

所以看起來gdb忽略了第二個斷點。 (因爲如果它真的用int3來代替它,程序將是完全錯誤的)。

問:什麼發生在第二個斷點,更具體地說,什麼是GDB處理它(或者是我學習的是錯了嗎?)

編輯: @dbrank已經給出關於改變一個很好的例子一個指令的數據字段,我會試着用一個類似的例子使它更全面(似乎是寄存器)。 enter image description here (約斷點的機制中的任何附圖理解!)

回答

1

插入斷點指令的中間將改變指令。

查看程序示例,其中插入斷點用斷點指令(0xcc(204))覆蓋分配給變量(42(0x2a))的原始值。

gdb debug inserting breakpoint in middle of instruction

你可以找到更多關於斷點如何工作here

您還可以查看GDB源代碼(大多數情況下,breakpoint.c & infrun.c)。

+0

我試過你的例子,但我的程序輸出原始數據?有任何想法嗎? – Tony

+0

上面的例子是爲-m32標誌編譯的(對於x86)。在x86_64編譯的代碼有點不同,你需要在不同的位置放置一個斷點(用斷點覆蓋原始值0x2a)。 – dbrank0

+0

對不起,這麼晚迴應,你的例子確實有效。感謝您的指導。 – Tony