在将控制权交还给用户之前,是否可以安排给定任务准确运行n
机器指令?
这个问题的动机是调试多线程程序,这可能有助于可靠地重现某些错误或未定义的行为。
我对在英特尔CPU上运行x86_64-linux
的情况特别感兴趣,但其他架构或操作系统的解决方案也很有趣。
内核perf
套件的文档说
性能计数器是大多数现代产品中可用的特殊硬件寄存器 的CPU。这些寄存器计算某些类型的hw事件的数量:例如 执行指令时,缓存失败或分支错误预测 - 不会减慢内核或应用程序的速度。这些寄存器也可以 当阈值数量的事件已经过去时触发中断。
因此看起来硬件原则上可以支持这一点,但我不确定这是否以任何方式暴露给用户。
当然可以使用ptrace
单步执行程序n
次,但这会使除了最简单程序之外的所有程序都变得非常慢。
答案 0 :(得分:1)
确保执行指令的精确计数的一个简单选项是检测汇编代码并维护执行计数器。我认为最简单的检测方法是Pin
(https://software.intel.com/en-us/articles/pintool)。
高层次的想法: - 解释机器代码并维护执行指令数的计数器,
在每条指令后递增计数器并检查是否是断点的时间,
在每个断点后重置计数器。
解释思路会引入相当多的开销。我看到了一些简单的优化:
静态设备二进制文件(创建一个新的二进制文件,其中所有这些增量/检查都是硬编码的)。这种方法将消除仪器/解释开销。您可以将与监视/断点相关的指令视为执行的额外指令,或者选择忽略它们的计数。
可以更智能地实施增量/检查。想象一下,我们有一组没有跳转/分支的指令,你可以做一次增量和一次检查。这个想法很简单,但在实践中可能会非常棘手,特别是如果你需要一个绝对准确的断点......