2016-10-11 1 views
0

J'ai cette variable globale dans mon pintool et je veux obtenir son contenu dans Instruction (ma fonction d'instrumentation).Variable globale dans 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); 
    ... 
} 

Comment est-ce que je peux faire ceci? J'ai essayé GLOBALVAR, LOCALVAR, const et static mais rien ne m'a redonné la valeur correcte.

Répondre

0

Une variable statique globale (à la portée du fichier) devrait fonctionner:

static UINT32 foo = 0; 

Sinon, vous pouvez utiliser le deuxième paramètre de 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; 
} 

Et dans votre fonction d'instrumentation, quelque chose le long:

// 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); 
}