Intel Pin:如何生成对象转储代码?

时间:2019-02-05 04:08:55

标签: c++ intel-pin

我正在尝试使用Intel-pin工具。我有一个简单的string = ("'"+df['type']+"'").str.cat(sep=',') string "'a','b','c'" (它只打印“ Hello world”)(例如Hello-world.c)。如果要从二进制文件生成程序集,则可以执行a.out

我想以此为指导。

在插桩之前(可以通过objdump轻松完成)和插桩之后,是否可以使用大头针工具获得objdump?

我已经创建了一个打印所有说明的工具。

objdump -D a.out

它会打印汇编说明,但是我不确定它是否包含已安装的说明。

这是执行此操作的正确方法吗?你能帮我吗?

1 个答案:

答案 0 :(得分:1)

  

在插桩之前(可以通过objdump轻松完成)和插桩之后,是否可以使用大头针工具获得objdump?

您将需要一种方法来告诉PIN引擎您要对objdump的结果进行处理。例如,您可能希望通过脚本链接它们。这完全取决于您想要做什么。

  

这是执行此操作的正确方法吗?

取决于您要确切执行的操作,但我想不是。

PIN中的仪器分析之间有明显的区别。一旦理解,其余的操作(相对)就容易了。

从概念上讲,PIN仪表包含两个组件:

  • 一种确定插入代码的位置和方式的机制:仪器
  • 要在插入点执行的代码:分析

话虽这么说,重要的一点:

  • 仅在一次上运行该仪器:当首次发现指令(或BBL或TRACE)时。
  • 每次运行分析都会被执行(或BBL,TRACE)指令。

因此,当您拥有:

// set up the **instrumentation**
INS_AddInstrumentFunction(Func_Instrumentation, 0);

您正在设置检测(然后仅被调用一次)。如果您需要在每次执行一条指令(或BBL,TRACE)时调用一次回调,则需要设置一个分析例程,例如:

// this is the **analysis** routine.
// This function is called before every instruction is executed
VOID docount() { icount++; }

// The is the **instrumentation routine**, called by INS_AddInstrumentFunction().
// Pin calls this function each time a **new** instruction is encountered
// Note that is won't be called for the same instruction after the first time.
VOID Func_Instrumentation(INS ins, VOID *v)
{
    // Insert a call to docount before every instruction, no arguments are passed
    INS_InsertCall(
        ins,              // a representation of the instruction
        IPOINT_BEFORE,    // where to insert, relative to the instruction
        (AFUNPTR)docount, // the analysis routine
        IARG_END);        // no args to pass to the analysis routine
}

仔细检查可用的指令计数样本: