c++ - 让任务运行固定数量的指令?

标签 c++ c linux multithreading

是否可以安排给定任务在控制返回给用户之前恰好运行 n 条机器指令?

这个问题的动机是多线程程序的调试,这可能有助于可靠地重现某些错误或未定义的行为。

我对在 Intel CPU 上运行的 x86_64-linux 特别感兴趣,但其他架构或操作系统的解决方案也很有趣。

内核 perf 套件的文档说

Performance counters are special hardware registers available on most modern CPUs. These registers count the number of certain types of hw events: such as instructions executed, cachemisses suffered, or branches mis-predicted - without slowing down the kernel or applications. These registers can also trigger interrupts when a threshold number of events have passed.

所以看起来硬件原则上可以支持这一点,但我不确定这是否以任何方式暴露给用户。

当然可以只使用 ptrace 来单步执行程序 n 次,但这会使除了最简单的程序以外的所有程序都慢得不可思议。

最佳答案

确保执行指令准确计数的一个简单方法是检测汇编代码并维护一个执行计数器。我相信最简单的检测方法是 Pin ( https://software.intel.com/en-us/articles/pintool )。

高层次的想法: - 解释机器代码并维护执行指令数的计数器,

  • 在每条指令之后递增计数器并检查是否到了设置断点的时间,

  • 在每个断点后重置计数器。

解释的想法会引入相当多的开销。我看到了许多简单的优化:

  • 静态检测二进制文件(创建一个新的二进制文件,其中所有这些增量/检查都是硬编码的)。这种方法将消除仪器/解释开销。您可以将与监控/断点相关的指令视为执行的额外指令或选择忽略它们进行计数。

  • 可以更巧妙地实现增量/检查。想象一下,我们有一组没有跳转/分支的指令,您可以执行一次增量和一次检查。这个想法很简单,但在实践中可能会非常棘手,尤其是当您需要一个绝对准确的断点时。

关于c++ - 让任务运行固定数量的指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32632930/

相关文章:

c++ - boost python中使用纯虚函数的多个派生类

c++ - 是否有类型特征可以立即删除顶级 cv 和引用?

c - 初始化一个整数数组

c - 有选择地抑制 glibc 链接警告?

c++ - C5002 1204 自动矢量化程序原因代码是什么意思?

C++:辛>> *字符

c - Visual Studio : Create a Hello World app in C?

c - 枚举C中的基本数据类型,以便于访问大小

ruby-on-rails - Nokogiri/Rails/zlib1g-dev 的问题

python - 如何通过vim进行交互?