Номера строк в трассировке 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.
Получить реальную линию гораздо сложнее, поэтому, если то, что я предложил, достаточно хорошо, я буду придерживаться этого