intel pin RTN_InsertCall множество аргументи на функция

Опитвам се да получа стойностите на аргументите на функция, използвайки intel pin. Функциите с един аргумент са достатъчно прости, като се използва примерът ManualExamples/malloctrace.cpp. Въпреки това, когато се опитвам да получа стойностите на аргумента с множество аргументи, срещам проблеми.

напр. Опитвам се да уловя стойностите на аргумента на следната функция:

void funcA(int a, int b, int c) {
    printf("Actual: %i %i %i\n", a,b,c);
}

Със следния пин код

VOID funcHandler(CHAR* name, int a, int b, int c) {
   printf("Pin: %s %i %i %i\n", name, a, b, c);
}

VOID Image(IMG img, VOID *v) {
    RTN funcRtn = RTN_FindByName(img, "funcA");
    if (RTN_Valid(funcRtn)) {
        RTN_Open(funcRtn);
        RTN_InsertCall(funcRtn, IPOINT_BEFORE, (AFUNPTR)funcHandler, 
                      IARG_ADDRINT, "funcA", IARG_FUNCARG_ENTRYPOINT_VALUE, 
                      0, IARG_END);
        RTN_Close(funcRtn);
    }
}

Получавам следния изход

Pin: funcA 0 -656937200 -10
Actual: 0 -10 0
Pin: funcA 1 -656937200 -9
Actual: 1 -9 20
Pin: funcA 2 -656937200 -8
Actual: 2 -8 40

Виждам, че съм близо, но нещо не е подравнено правилно. Знам за RTN_ReplaceProbed, но трябва да използвам pin в режим jit, тъй като имам нужда от инструменти на ниво инструкции.


person Mark    schedule 25.10.2011    source източник


Отговори (2)


Мисля, че всъщност е доста лесно да се поправи, тъй като основно сте направили всичко правилно в началото.

Единственият проблем е, че когато извиквате RTN_InsertCall, извличате само първия аргумент (поради което Pin и Actual са еднакви за първия аргумент, но не и за другите). Просто трябва да дадете още няколко аргумента на RTN_InsertCall, така че funcHandler да получи всички необходими аргументи.

И така, вместо

RTN_InsertCall(funcRtn, IPOINT_BEFORE, (AFUNPTR)funcHandler, 
    IARG_ADDRINT, "funcA", IARG_FUNCARG_ENTRYPOINT_VALUE, 
    0, IARG_END);

просто го направи

RTN_InsertCall(funcRtn, IPOINT_BEFORE, (AFUNPTR)funcHandler, 
    IARG_ADDRINT, "funcA", IARG_FUNCARG_ENTRYPOINT_VALUE, 
    0, IARG_FUNCARG_ENTRYPOINT_VALUE, 1,
    IARG_FUNCARG_ENTRYPOINT_VALUE, 2, IARG_END);

Всичко, което направих, беше да добавя още няколко IARG_FUNCARG_ENTRYPOINT_VALUE с 1 и 2, за да получа 1-ви и 2-ри аргумент, след като вече сте получили 0-ия аргумент.

В момента не съм на машината, на която имам Pin, настроен за тестване, но ако не работи, уведомете ме.

person leebeckman    schedule 31.10.2011

Примерът в Tests/callargs.cpp дава правилни резултати.

   VOID funcA(ADDRINT a, ADDRINT b, ADDRINT c) {
      printf("Pin: %i %i %i\n", (int)a, (int)b, (int)c);
   }


   RTN_InsertCall(startRtn, IPOINT_BEFORE, AFUNPTR(StartHandler), IARG_G_ARG0_CALLER, IARG_G_ARG1_CALLER, IARG_G_ARG2_CALLER, IARG_END);
person Mark    schedule 27.10.2011