Номера строк в трассировке malloc с использованием PIN-кода

Я работаю над Pintool для отслеживания операций malloc/free. Из ManualExamples/malloc_trace.cpp я смог распечатать malloc/free в образце кода.

Мне было интересно, есть ли способ напечатать номера строк в исходном коде, где встречается malloc/free. В следующем файле malloctrace.cpp, где используется malloc, могу ли я добавить какой-либо параметр или другой вызов для печати номера строки.

if (RTN_Valid(mallocRtn))
 {   
     RTN_Open(mallocRtn);
     // Instrument malloc() to print the input argument value and the return value.
     RTN_InsertCall(mallocRtn, IPOINT_BEFORE, (AFUNPTR)Arg1Before,
                    IARG_ADDRINT, MALLOC,
                    IARG_FUNCARG_ENTRYPOINT_VALUE, 0, IARG_END); 
     RTN_InsertCall(mallocRtn, IPOINT_AFTER, (AFUNPTR)MallocAfter,
                   IARG_FUNCRET_EXITPOINT_VALUE, IARG_END);
    RTN_Close(mallocRtn);
}

В DebugTrace.cpp вижу функцию

 string FormatAddress(ADDRINT address, RTN rtn)

который может печатать номер строки для RTN. Есть ли способ использовать эту функцию для получения номеров строк для malloc?

// ОТРЕДАКТИРОВАНО

Я написал новую функцию

 VOID printline(ADDRINT instr_ptr )
    {
// get source line

        INT32 line;
        string file,s ;

        PIN_LockClient();
         LEVEL_PINCLIENT::PIN_GetSourceLocation(instr_ptr, NULL, &line, &file);
        PIN_UnlockClient();

        if (file != "") 
        {   
        TraceFile << file << " " << decstr(line) << endl;           
        }   
}

и я вызываю свою основную функцию

 RTN_InsertCall(mallocRtn, IPOINT_BEFORE, (AFUNPTR)printline,
                       IARG_INST_PTR, IARG_END);

Это правильный способ использования функции «GetSourceLocation», я пробовал это, он отлично компилируется, но не печатает номера строк.

Спасибо, К


person marc    schedule 26.09.2016    source источник


Ответы (2)


Вы можете попробовать следующий API:

  void LEVEL_PINCLIENT::PIN_GetSourceLocation(ADDRINT   address,
        INT32 *     column,
        INT32 *     line,
        string *    fileName
    )

http://www.cs.virginia.edu/kim/publicity/pin/docs/25945/Pin/html/group__DEBUG__API.html

Скомпилируйте с помощью $ gcc -g program.cpp -o program -gdwarf-2

person Bernard Nongpoh    schedule 27.09.2016

Вы можете очень легко подобраться очень близко: вы можете получить обратный адрес от malloc с помощью IARG_RETURN_IP и использовать его в качестве входных данных для PIN_GetSourceLocation(). Обычно это приведет вас к строке после malloc.

Получить реальную линию гораздо сложнее, поэтому, если то, что я предложил, достаточно хорошо, я бы придерживался этого.

person nitzanms    schedule 28.09.2016
comment
Я пытался использовать IARG_RETURN_IP таким образом, это не работает, это правильный путь? RTN_InsertCall(mallocRtn, IPOINT_AFTER, (AFUNPTR)линия печати, IARG_ADDRINT, IARG_RETURN_IP, IARG_FUNCRET_EXITPOINT_VALUE, IARG_END); - person marc; 10.10.2016
comment
1. Попробуйте использовать IPOINT_BEFORE 2. Похоже, вы неправильно используете IARG. Я рекомендую создать еще один вопрос об использовании IARG после поиска примера в наборе контактов. - person nitzanms; 11.10.2016