使用Pin

时间:2016-09-26 23:05:30

标签: c++ intel-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的行号?

// 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”功能的正确方法,我试过这个,它编译得很好但不打印行号。

谢谢, ķ

2 个答案:

答案 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之后的行。

获得真实线条要复杂得多,所以如果我建议的内容足够好我就会坚持下去