私は、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