2016-09-26 3 views
0

malloc/free 작업을 추적하기 위해 Pintool에서 작업 중입니다. ManualExamples/malloc_trace.cpp에서 샘플 코드에서 malloc/free를 인쇄 할 수있었습니다.Pin을 사용하는 malloc 트레이스의 라인 번호

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에서, I는 RTN 행 번호를 인쇄 할 수있는 기능

string FormatAddress(ADDRINT address, 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

답변

0

매우 가까이에서 매우 쉽게 얻을 수 있습니다 : IARG_RETURN_IP를 사용하여 malloc에서 반환 주소를 가져 와서 이것을 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