在gdb中设置随机地址断点

时间:2014-12-25 12:56:51

标签: debugging gdb breakpoints

我正在学习一些断点机制,我了解到'在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运行它。 enter image description here

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

所以似乎gdb忽略了第二个断点。 (因为如果它真的用int3重新实现它,程序就完全错了。)

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

编辑: @dbrank已经提供了一个关于改变指令数据字段的很好的例子,我将尝试使用类似的例子(它似乎是寄存器)使其更全面。 enter image description here (欢迎任何关于断点机制的参考!)

1 个答案:

答案 0 :(得分:1)

在指令中间插入断点将改变指令。

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

gdb debug inserting breakpoint in middle of instruction

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

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