Debugging 在gdb中设置随机地址断点
我正在学习断点的一些机制,我了解到“在x86中,存在一条名为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
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)。很抱歉响应这么晚,您的示例确实有效。谢谢你的指导。