PTRACE_SINGLESTEP是如何实现的?

bch*_*ill 2 linux x86 assembly x86-64

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

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

Pet*_*des 5

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

出于某种原因,Trap Flag有自己的维基百科文章!另见维基百科的EFLAGS文章.

有关所有这些内容的英特尔架构手册的链接,请参阅标签wiki.


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

然后你需要代码来确定解码x86指令长度.并且您不会使用ud2,您将使用int3为此目的而存在的.

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