2016-09-26 31 views
0

我正在使用Pintool來跟蹤malloc/free操作。從ManualExamples/malloc_trace.cpp中,我可以在示例代碼中打印出malloc/free。使用Pin的malloc跟蹤中的行號

我想知道是否有辦法在遇到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

您可以非常輕鬆地得到非常接近的結果:您可以從malloc中獲取返回地址與IARG_RETURN_IP,並將其用作PIN_GetSourceLocat的輸入離子()。這通常會引導你到malloc之後的行。

得到真正的線要複雜得多,所以如果我認爲是不夠好我會堅持到

+0

謝謝,請參閱編輯的問題。 – marc

+0

我一直在以這種方式嘗試使用IARG_RETURN_IP,它不起作用,這是正確的方式嗎? RTN_InsertCall(mallocRtn,IPOINT_AFTER,(AFUNPTR)printline, IARG_ADDRINT,IARG_RETURN_IP, IARG_FUNCRET_EXITPOINT_VALUE, IARG_END); – marc

+0

1.嘗試使用IPOINT_BEFORE 2.您似乎沒有正確使用IARG。我推薦在引腳工具包中搜索示例之後,創建另一個關於使用IARG的問題。 – nitzanms