0

私は、malloc/free 操作をトレースするための Pintool に取り組んでいます。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」関数を使用する正しい方法ですか、私はこれを試しましたが、うまくコンパイルされますが、行番号は出力されません。

ありがとう、K

4

2 に答える 2

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 に答える
0

IARG_RETURN_IP を使用して malloc から戻りアドレスを取得し、これを PIN_GetSourceLocation() への入力として使用できます。これにより、通常、malloc の後の行に移動します。

実際の行を取得するのははるかに複雑なので、私が提案したものが十分に良い場合は、それに固執します

于 2016-09-28T06:07:17.480 に答える