跟踪英特尔PIN中的本机指令

时间:2017-10-06 00:21:16

标签: c++ c assembly intel-pin

我正在使用英特尔PIN工具对C程序的汇编指令进行一些分析。我有一个简单的C程序打印" Hello World",我编译并生成了一个可执行文件。我有从gdb生成的汇编指令跟踪 -

Dump of assembler code for function main:
   0x0000000000400526 <+0>:     push   %rbp
   0x0000000000400527 <+1>:     mov    %rsp,%rbp
=> 0x000000000040052a <+4>:     mov    $0x4005c4,%edi
   0x000000000040052f <+9>:     mov    $0x0,%eax
   0x0000000000400534 <+14>:    callq  0x400400 <printf@plt>
   0x0000000000400539 <+19>:    mov    $0x0,%eax
   0x000000000040053e <+24>:    pop    %rbp
   0x000000000040053f <+25>:    retq   
End of assembler dump.

我运行了一个pintool,我将可执行文件作为输入,我正在执行指令跟踪并打印指令数。我希望跟踪来自我的C程序的指令,并可能得到机器操作码并进行某种分析。我正在使用C ++ PIN工具来计算指令数量 -

#include "pin.H"
#include <iostream>
#include <stdio.h>

UINT64 icount = 0;
using namespace std;

//====================================================================
// Analysis Routines
//====================================================================

void docount(THREADID tid) {
    icount++;
}

//====================================================================
// Instrumentation Routines
//====================================================================

VOID Instruction(INS ins, void *v) {
    INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_THREAD_ID, IARG_END);
}

VOID Fini(INT32 code, VOID *v) {
    printf("count = %ld\n",(long)icount);
}

INT32 Usage() {
    PIN_ERROR("This Pintool failed\n"
              + KNOB_BASE::StringKnobSummary() + "\n");
    return -1;
}

int main(int argc, char *argv[]) {
    if (PIN_Init(argc, argv)) return Usage();

    PIN_InitSymbols();
    PIN_AddInternalExceptionHandler(ExceptionHandler,NULL);
    INS_AddInstrumentFunction(Instruction, 0);
    PIN_AddFiniFunction(Fini, 0);
    PIN_StartProgram();

    return 0;
}

当我使用此工具运行我的hello world程序时,我得到icount = 81563.我知道PIN添加了自己的分析说明,但我不明白它是如何添加如此多的指令,而我不是&# 39;我的C程序中有超过10条指令。还有一种方法可以识别来自我的代码和PIN生成的汇编指令。我似乎无法区分PIN生成的指令和我的程序生成的指令。请帮助!

1 个答案:

答案 0 :(得分:1)

您没有衡量您认为自己正在衡量的内容。有关详细信息,请参阅我的答案 What instructions 'instCount' Pin tool counts?

Pin 计算自己的指令。大数是main()之前和之后以及对printf()的调用的准备结果。