英特尔引脚:如何生成对象转储ish代码

Intel Pin: How to generate objectdump-ish code?

本文关键字:转储 ish 代码 对象 何生成 引脚 英特尔      更新时间:2023-10-16

我正在试用intel pin工具。我有一个简单的Hello-world.c(它只打印"你好世界")程序(比如a.out)。如果我想从二进制文件生成程序集,我会执行objdump -D a.out

我想在其中插入一些说明。

是否可以在检测之前和之后使用pin工具获取objdump?

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

#include <stdio.h>
#include "pin.H"
#include <cstdint>
FILE * trace;
KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "pinatrace.out","A pin tool");
VOID Count(INS ins, void *v) {

fprintf(trace,"n%s",(INS_Disassemble(ins)).c_str());
}
VOID Fini(INT32 code, VOID *v)
{
printf("count = %ldn",(long)icount);
fprintf(trace, "#eofn");
fclose(trace);
}
/* ===================================================================== */
/* Print Help Message                                                    */
/* ===================================================================== */
INT32 Usage()
{
PIN_ERROR( "This Pintool prints a trace of memory addressesn"
+ KNOB_BASE::StringKnobSummary() + "n");
return -1;
}
/* ===================================================================== */
/* Main                                                                  */
/* ===================================================================== */
int main(int argc, char *argv[])
{
if (PIN_Init(argc, argv)) return Usage();
trace = fopen("pinatrace.out", "w");

INS_AddInstrumentFunction(Count, 0);
PIN_AddFiniFunction(Fini, 0);
// Never returns
PIN_StartProgram();
return 0;
}

它打印汇编指令,但我不确定它是否包括插入指令。

这样做正确吗?你能帮帮我吗?

在插入之前和之后,是否可以使用pin工具获取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
}

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

  • source/tools/ManualExamples/inscount0.cpp
  • 在PIN手册中