Номера строк в трассировке 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", я пробовал это, он прекрасно компилируется, но не печатает номера строк.

Спасибо, к

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

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

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

Другие вопросы по тегам