2014-12-25 45 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