2015-10-05 20 views
0

你好,我运行pin toll itrace.cpp文件来获取代码的跟踪。引脚工具和itrace

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

FILE * trace; 

// This function is called before every instruction is executed 
// and prints the IP 
VOID printip(VOID *ip) { fprintf(trace, "%p\n", ip); } 

// Pin calls this function every time a new instruction is encountered 
VOID Instruction(INS ins, VOID *v) 
{ 
    // Insert a call to printip before every instruction, and pass it the IP 
    INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)printip, IARG_INST_PTR, IARG_END); 
} 

// This function is called when the application exits 
VOID Fini(INT32 code, VOID *v) 
{ 
    fprintf(trace, "#eof\n"); 
    fclose(trace); 
} 

/* ===================================================================== */ 
/* Print Help Message             */ 
/* ===================================================================== */ 

INT32 Usage() 
{ 
    PIN_ERROR("This Pintool prints the IPs of every instruction executed\n" 
      + KNOB_BASE::StringKnobSummary() + "\n"); 
    return -1; 
} 

/* ===================================================================== */ 
/* Main                 */ 
/* ===================================================================== */ 

int main(int argc, char * argv[]) 
{ 
    trace = fopen("itrace.out", "w"); 

    // Initialize pin 
    if (PIN_Init(argc, argv)) return Usage(); 

    // Register Instruction to be called to instrument instructions 
    INS_AddInstrumentFunction(Instruction, 0); 

    // Register Fini to be called when the application exits 
    PIN_AddFiniFunction(Fini, 0); 

    // Start the program, never returns 
    PIN_StartProgram(); 

    return 0; 
} 

,我有以下追踪:

这是一个示例:

0x40001e90 
0x40001e91 
0x40001ee4 
0x40001ee5 

我怎样才能找到其中的每个命令此跟踪属于? 我用objdump -S myfile但我无法找到任何东西。

预先感谢您。

回答

0

使用一个程序查找IP

objdump -S exe > exe.asm 

搜索40001e90而不是0x40001e90

1

你应该使用 “INS_Disassemble(INS INS)” 功能作为API

类似下面列出的会做

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

FILE * trace; 

// This function is called before every instruction is executed 
// and prints the IP 
VOID printip(VOID *ip, const string *s) { fprintf(trace, "%p --> %s\n", ip, s->c_str()); } 

// Pin calls this function every time a new instruction is encountered 
VOID Instruction(INS ins, VOID *v) 
{ 
    string instrString = INS_Disassemble(ins); 
    // Insert a call to printip before every instruction, and pass it the IP 
    INS_InsertCall(ins, IPOINT_BEFORE, 
        (AFUNPTR)printip, 
        IARG_INST_PTR, 
        IARG_PTR, new string(instrString), 
        IARG_END); 
} 

// This function is called when the application exits 
VOID Fini(INT32 code, VOID *v) 
{ 
    fprintf(trace, "#eof\n"); 
    fclose(trace); 
} 

/* ===================================================================== */ 
/* Print Help Message             */ 
/* ===================================================================== */ 

INT32 Usage() 
{ 
    PIN_ERROR("This Pintool prints the IPs of every instruction executed\n" 
      + KNOB_BASE::StringKnobSummary() + "\n"); 
    return -1; 
} 

/* ===================================================================== */ 
/* Main                 */ 
/* ===================================================================== */ 

int main(int argc, char * argv[]) 
{ 
    trace = fopen("itrace.out", "w"); 

    // Initialize pin 
    if (PIN_Init(argc, argv)) return Usage(); 

    // Register Instruction to be called to instrument instructions 
    INS_AddInstrumentFunction(Instruction, 0); 

    // Register Fini to be called when the application exits 
    PIN_AddFiniFunction(Fini, 0); 

    // Start the program, never returns 
    PIN_StartProgram(); 

    return 0; 
}