Debugging 在gdb中设置随机地址断点

Debugging 在gdb中设置随机地址断点,debugging,gdb,breakpoints,Debugging,Gdb,Breakpoints,我正在学习断点的一些机制,我了解到“在x86中,存在一条名为int3的指令,用于调试器中断CPU。然后CPU将通过信号”中断正在运行的程序 例如: 8048e20: 55 push %ebp 8048e21: 89 e5 mov %esp,%ebp 当用户输入 b*0x8048e21 指令将替换为int3(操作码0xcc)并变为: 8048e20: 55

我正在学习断点的一些机制,我了解到“在x86中,存在一条名为
int3
的指令,用于调试器中断CPU。然后CPU将通过
信号
”中断正在运行的程序

例如:

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

调试器是否仍将
e5
替换为
cc
?因此,我编写了一个简单的示例,并使用gdb运行它。

正如您在上面看到的,我设置了两个断点,第二个断点位于断点的中间。我输入
r
并在第一个断点处停止,然后输入
c
并运行到最后

因此,gdb似乎忽略了第二个断点。(因为如果它真的用
int3
重新编程,程序将完全错误)

问题:第二个断点发生了什么,更具体地说,gdb如何处理它(或者我所了解的是错误的?)

Edit:@dbrank已经给出了一个关于更改指令数据字段的很好的示例,我将尝试用一个类似的示例(似乎是寄存器)使其更全面。
<强>(关于断点机制的任何引用都被理解了)< <强> >/p> < p>在指令中间插入断点将改变指令。

请参阅此程序示例,其中插入断点将用断点指令(0xcc(204))覆盖分配给变量(42(0x2a))的原始值

您可以找到有关断点如何工作的更多信息


您还可以查看GDB源代码(主要是breakpoint.c和infun.c)。

我尝试了您的示例,但是我的程序输出了原始数据?有什么想法吗?上面的例子是为-m32标志(对于x86)编译的。在x86_64上编译的代码有点不同,您需要在不同的位置放置一个断点(用断点覆盖原始值0x2a)。很抱歉响应这么晚,您的示例确实有效。谢谢你的指导。