在把控制返回给用户之前,是否有可能安排一个给定的任务来正确运行n
机器指令?
这个问题的动机是multithreading程序的debugging,这可能有助于可靠地重现某些错误或未定义的行为。
我特别感兴趣的是x86_64-linux
在Intel CPU上运行的情况,但其他体系结构或操作系统的解决scheme也会很有趣。
内核perf
套件的文档说
性能计数器是大多数现代CPU上可用的特殊硬件寄存器。 这些寄存器计算某些types的hw事件的数量:例如执行的指令,遭受的cachemisses或分支错误预测 – 不减慢内核或应用程序。 当事件达到阈值时,这些寄存器也可以触发中断。
所以似乎硬件原则上可以支持这一点,但我不确定这是否以任何方式暴露给用户。
当然也可以使用ptrace
来单步执行这个程序n
次,但是除了最简单的程序之外,其他所有的程序都可能会很慢。
确保所执行指令的确切计数的一个简单选项是对汇编代码进行汇编,并维护一个执行计数器。 我相信做仪器最简单的方法是Pin
( https://software.intel.com/en-us/articles/pintool )。
高层次的想法: – 解释机器代码并保持执行的指令数量的计数器,
在每个指令之后,你增加计数器并检查是否是断点的时间,
在每个断点之后重置计数器。
解释的想法会带来相当多的开销。 我看到一些简单的优化:
静态设置二进制文件(创建一个新的二进制文件,所有这些增量/检查都是硬编码的)。 这种方法将消除仪表/解释的开销。 您可以将与监视/断点相关的指令视为已执行的额外指令,或选择忽略它们。
增量/检查可以更巧妙地实施。 想象一下,我们有一套没有跳转/分支的指令,你可以做一个增量和一个检查。 这个想法很简单,但在实践中可能会相当棘手,特别是如果你需要一个绝对准确的断点。