PTRACE_SINGLESTEP是如何实现的?

时间:2016-08-21 13:57:07

标签: linux assembly x86 x86-64

据我所知(我可能错了),没有办法在x86-64系统上执行一个指令。也许您可以执行“ud2”操作码后面的指令来触发信号 - 但是您必须担心指令修改控制流并转到其他地方。

然而,如果我理解正确,ptrace()系统调用具有一个只执行单个指令的SINGLESTEP选项。这是如何实现的?我无法想象内核有某种反汇编程序来识别它的指令和原因。那么,是否有一些我不知道的建筑功能呢?还是完全不同的东西?

1 个答案:

答案 0 :(得分:5)

是的,这是一个架构的单步标志。从内核返回到用户空间使内核有机会同时设置RIP / RFLAGS,因此它可以为用户空间设置单步,而无需在内核指令上触发。

出于某种原因,Trap Flag有自己的维基百科文章!另请参阅wikipedia's EFLAGS article

请参阅标记维基,获取英特尔架构手册的链接,该手册记录了所有这些内容。

  

也许您可以执行“ud2”操作码后面的指令来触发信号

然后你需要代码来确定解码x86指令长度。并且您不会使用ud2,而是使用int3 which exists for this purpose.

IIRC,还有调试寄存器,可以在不修改代码的情况下设置硬件断点。