Глобальная переменная в Intel Pin

У меня есть эта глобальная переменная в моем пинтуле, и я хочу получить ее содержимое внутри инструкции (моя инструментальная функция).

UINT32 windowCnt=0;

LOCALFUN VOID Instruction(INS ins, VOID *v)
{

    const AFUNPTR InsRefFun = ((wcount % 2)==0 ? (AFUNPTR) InsRef_Skip : (AFUNPTR) InsRef);



    INS_InsertIfCall(
       ins, IPOINT_BEFORE, (AFUNPTR)InsRefFun,
       IARG_THREAD_ID,
       IARG_INST_PTR,
       IARG_END);
  ...
}

Как я могу это сделать? Я пробовал GLOBALVAR, LOCALVAR, const и static, но ничего не вернуло мне правильное значение.


person Orion Papadakis    schedule 11.10.2016    source источник


Ответы (1)


Статическая глобальная переменная (в области файла) должна работать:

static UINT32 foo = 0;

В противном случае вы можете использовать второй параметр INS_AddInstrumentFunction:

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

    UINT32 foo = 0;

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

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

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

    return 0;
}

И в вашей инструментальной функции что-то вроде:

// Pin calls this function every time a new instruction is encountered
VOID Instruction(INS ins, VOID *v)
{
    if(v == NULL)
        return;

    UINT32 myfoo = *((UINT32*)v); //in c++: myFoo = *reinterptet_cast<UINT32*>(v)

    // Insert a call to doSomething before every instruction, no arguments are passed
    INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)doSomething, IARG_END);
}
person Neitsa    schedule 24.11.2016