0

我正在使用 Pintool 来跟踪 malloc/free 操作。从 ManualExamples/malloc_trace.cpp 我能够在示例代码中打印出 malloc/free。

我想知道是否有办法在遇到 malloc/free 的源代码中打印行号。在以下检测 malloc 的 malloctrace.cpp 中,我可以添加任何参数或另一个调用来打印行号。

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”函数的正确方法吗?我试过了,它编译得很好,但不打印行号。

谢谢,克

4

2 回答 2

0

您可以非常轻松地接近:您可以使用 IARG_RETURN_IP 从 malloc 获取返回地址,并将其用作 PIN_GetSourceLocation() 的输入。这通常会将您带到 malloc 之后的行。

获得真正的路线要复杂得多,所以如果我的建议足够好,我会坚持下去

于 2016-09-28T06:07:17.480 回答
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 编译

于 2016-09-27T06:42:09.170 回答