2

所以我正在写一个调试器。在调试器中,我想要持久的断点。现在我正在努力让它只设置一个断点。当我告诉调试器继续时,我这样做......

ptrace( PTRACE_GETREGS, child, NULL, &regs);
printf("%lx\n", regs.rip);
ptrace( PTRACE_SINGLESTEP, child, NULL, NULL);
ptrace( PTRACE_GETREGS, child, NULL, &regs);
printf("%lx\n", regs.rip);
ptrace( PTRACE_POKETEXT, child, (void *)original_addr, (original_data & ~0xff) | 0xcc);

但是,我得到了输出......

40053d
40053d

这意味着 rip 实际上并没有更新。这与以下事实一致,即当我在断点上的迭代次数多于迭代次数时,它仍然在断点中。有什么想法吗?

编辑:这就是问题所在。子进程在看到 wait() 调用之前实际上并没有运行 SINGLESTEP,此时它运行并在执行单个指令时将控制权返回给父进程。我没有打电话给等待,所以当时它没有更新。所以它只是把同一个打印出来两次。然后,它到达检查点状态,并在指令开始时更新为原始 %rip。干杯。

4

0 回答 0