linux - 如何使用 Intel Pin 工具生成分支列表?

标签 linux cpu-architecture instructions intel-pin

我对使用 Intel Pin 工具进行代码检测还比较陌生,我正在尝试研究分支预测。具体来说,我想生成所有分支的列表、它们的分支目标以及它们是否被采用。我知道 SimpleExamples 中有用于生成内存地址跟踪的 pintools,例如“pinatrace.cpp”工具,但我没有看到任何适合我列出分支的需求。

示例中是否有我可以使用的现有 pintool,或者我是否需要编写一个新的 pintool?

我在 Linux 计算机上使用 pin-2.14。

谢谢!

最佳答案

我不确定是否有 pintool 示例可以执行此操作,但这可以相对简单地完成。

如果我没理解错的话,你想要三样东西:

  1. 所有条件分支的地址

  2. 目标

  3. 已决定/未决定

1/2。这可以通过使用指令级检测来实现。使用 INS_AddInstrumentFunction(Instruction, 0)为了允许功能 Instruction(INS ins, VOID *v)每次要执行一条新指令时调用。然后在那里面 Instruction()功能,你可以使用if(INS_IsBranch(ins) && INS_HasFallThrough(ins))判断当前指令是否为条件分支的表达式。如果是,存储它的地址 INS_Address(ins)连同它的目标 INS_DirectBranchOrCallTargetAddress(ins) .也许您可以出于调试目的打印其反汇编 INS_Disassemble(ins) .

3.为了打印出决策,您必须在每个条件分支之前插入一个分析例程。使用上面的 Instruction 函数,在 if(INS_IsBranch(ins) && INS_HasFallThrough(ins)) 中,使用此 API 调用:

INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)<YOUR FUNCTION NAME>, IARG_INST_PTR, IARG_BRANCH_TAKEN, IARG_END)

使用它,您可以创建一个分析例程,该例程将在每次动态执行条件分支时运行。从那里使用 IARG_BRANCH_TAKEN 参数,你可以做一个简单的检查来确定分支是否被采用。将决定存储在 map 或类似 map 的东西中,以便稍后打印出来。警告:不要在分析例程中打印出任何东西(打印出指令的动态轨迹从来都不是一个好主意)。另请注意,条件分支可能会针对不同的已采取/未采取决定运行不止一次,因此您可能需要跟踪多个决定。

希望这对您有所帮助。

干杯,

丹尼

关于linux - 如何使用 Intel Pin 工具生成分支列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36002452/

相关文章:

linux - 从二进制文件列表中打印包含特定 ascii 字符串的二进制文件

python - wxPython 适合硬件模拟器吗?

caching - L4缓存发生了什么?

assembly - 在两个内存地址之间移动

cpu - CPU 指令重新排序的跟踪

linux - Matlab:如何通过命令行(非 GUI)使用神经网络工具箱

linux - 如何将输入发送到多个终端窗口(不是选项卡)?

c - 如何强制正在运行的程序使用外部方式将其 I/O 缓冲区的内容刷新到磁盘?

caching - L1缓存通常是分体式设计,而L2、L3缓存却是统一设计,为什么呢?

assembly - 为什么 repe 和 repne 在 movsb 之前做同样的事情?