我正在使用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的行号?
// EDITED
我写了一个新函数
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”功能的正确方法,我试过这个,它编译得很好但不打印行号。
谢谢, ķ
答案 0 :(得分:0)
您可以尝试以下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
进行编译答案 1 :(得分:0)
您可以非常轻松地接近:您可以使用IARG_RETURN_IP从malloc获取返回地址,并将其用作PIN_GetSourceLocation()的输入。这通常会引导您到malloc之后的行。
获得真实线条要复杂得多,所以如果我建议的内容足够好我就会坚持下去