2012-10-31 3 views
1

핀 도구를 사용하여 다른 루틴에서 스택을 인쇄하려고합니다. 모든 루틴을 가져올 수 있지만 그 루틴 스택에있는 레지스터에 저장된 주소를 얻는 방법에 대해서는 약간 혼란 스럽습니다.핀 도구를 사용하여 스택에서 레지스터의 값을 인쇄하려고합니다.

는 내가 가지고있는 것은 이것이다 :

VOID SETRTN_CONTEXT(CONTEXT * ctxt) 
{ 
    ADDRINT reg_address; 

    PIN_SaveContext(ctxt, &m_ctxt); 
    reg_address = PIN_GetContextReg(&m_ctxt, REG_STACK_PTR); 
} 

다른 기능에 내가 그 기능을 호출하는 코드의이 작품이

:
for(rtn = SEC_RtnHead(sec); RTN_Valid(rtn); rtn = RTN_Next(rtn)) 
{ 
    RTN_Open(rtn); 
    RTN_InsertCall(rtn, IPOINT_BEFORE, (AFUNPTR)SETRTN_CONTEXT, 
     IARG_CONST_CONTEXT, IARG_THREAD_ID, IARG_END); 
    RTN_Close(rtn); 
} 

내가 때 루틴 호출에 조금 혼란 스러워요을 그 함수는 단지 하나의 결과를 얻고 있기 때문에 Pin을 붙이고 2 초를 기다린 후에 얻습니다.

저에게 도움이 될만한 핀 머리가 있습니까? 나는 레지스터를 얻기 위해 루틴에서 컨텍스트가 필요하지만 오브젝트로서 컨텍스트를 반환하는 함수를 찾을 수 없다는 것을 이해합니다 ...

+0

이것은 사용중인 핀 도구에 따라 다릅니다. 설명서를 보았습니까? 나는 [this] (http://www.cs.virginia.edu/kim/publicity/pin/docs/39599/Pin/html/index.html)이 그것이라고 믿는다. –

+0

사용자 모드 디버거를 사용하지 않는 이유는 무엇입니까? –

+0

예 전 문서를 다 읽고 도움이되는 것이 없습니다. 그것은 너무 구체적이지 않습니다.이 코드에서 사용되는 모든 함수는 Pin API에서 가져온 것으로 모든 결과가 전혀 나오지 않습니다 .. @ slavik262 – attis

답변

0

RTN_InsertCall에서 스레드 ID를 추가하고 SETRTN_CONTEXT 함수 선언은 스레드 ID를받지 못했습니다 ...이를 수정하려고 할 수 있습니다.

또한 분석 루틴 SETRTN_CONTEXT에서 실제로 응용 프로그램 외부에 아무것도 저장하지 않습니다. m_ctxt가 다른 곳에서 조작하는 전역 변수 인 경우 잘못 될 수 있습니다. 분석 루틴이 실행될 때마다 스레드 안전 방법으로 실행하지 않는 한 어떻게 소리가 날 수 있습니까?

분명히 정보를 일부 파일이나 출력에 쓰려고합니다. 나는 어떤 종류의 xml 도구를 사용하도록 권합니다. 이렇게하면 구문 분석이 쉬워지고 pintools를 현명하게 작성하면 인터페이스 계약에 따라 출력 형식을 교환 할 수 있습니다.

또한 혼동을 분명히하기 위해 특정 이미지의 모든 단일 기능 전에 분석 루틴을 삽입하려고 시도합니다. 해당 이미지에서 해당 함수가 호출 될 때마다 SETRTN_CONTEXT가 실행됩니다.