Intel Pin RTN_InsertCall несколько аргументов функции - PullRequest
4 голосов
/ 26 октября 2011

Я пытаюсь получить значения аргументов функции, используя пин-код intel.Функции с одним аргументом достаточно просты, используя пример 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, так как мне нужны инструменты уровня инструкций.

Ответы [ 2 ]

7 голосов
/ 31 октября 2011

Я думаю, что на самом деле это довольно легко исправить, так как у вас все в порядке с самого начала.

Единственная проблема заключается в том, что при вызове 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-й аргумент.

В настоящее время я не на той машине, на которой настроен Пин.чтобы проверить, но если это не сработает, дайте мне знать.

0 голосов
/ 28 октября 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);
...