我正在学习一些断点机制,我了解到'在x86中,存在一个名为int3
的指令,用于调试器来中断CPU。然后CPU将通过signal
'中断正在运行的程序。
例如:
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处理它的是什么(或者我学到的是错误的?)
编辑: @dbrank已经提供了一个关于改变指令数据字段的很好的例子,我将尝试使用类似的例子(它似乎是寄存器)使其更全面。 (欢迎任何关于断点机制的参考!)
答案 0 :(得分:1)
在指令中间插入断点将改变指令。
请参阅此程序示例,其中插入断点将使用断点指令(0xcc(204))覆盖分配给变量(42(0x2a))的原始值。
您可以找到有关断点如何工作的更多信息here。
您还可以查看GDB源(主要是breakpoint.c和infrun.c)。