PTRACE_SINGLESTEP没有移动%rip

时间:2013-10-10 17:59:31

标签: c ptrace

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

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。欢呼声。

0 个答案:

没有答案