2011-10-25 2 views
3

intel 핀을 사용하여 함수의 인수 값을 얻으려고합니다. 단일 인수 함수는 예제 인 ManualExamples/malloctrace.cpp를 사용하여 충분히 간단합니다. 그러나 여러 인수를 사용하여 인수 값을 얻으려고하면 문제가 발생합니다.인텔 핀 RTN_InsertCall 여러 함수 인수

예 : 다음 함수의 인수 값을 캡처하려고 :

VOID funcHandler(CHAR* name, int a, int b, int c) { 
    printf("Pin: %s %i %i %i\n", name, a, b, c); 
} 

VOID Image(IMG img, VOID *v) { 
    RTN funcRtn = RTN_FindByName(img, "funcA"); 
    if (RTN_Valid(funcRtn)) { 
     RTN_Open(funcRtn); 
     RTN_InsertCall(funcRtn, IPOINT_BEFORE, (AFUNPTR)funcHandler, 
         IARG_ADDRINT, "funcA", IARG_FUNCARG_ENTRYPOINT_VALUE, 
         0, IARG_END); 
     RTN_Close(funcRtn); 
    } 
} 

나는 다음과 같은 출력을 얻을 다음 PIN 코드로

void funcA(int a, int b, int c) { 
    printf("Actual: %i %i %i\n", a,b,c); 
} 

Pin: funcA 0 -656937200 -10 
Actual: 0 -10 0 
Pin: funcA 1 -656937200 -9 
Actual: 1 -9 20 
Pin: funcA 2 -656937200 -8 
Actual: 2 -8 40 

내가 가까이있어 것을 알 수 있습니다 , 그러나 무언가가 제대로 정렬되지 않습니다. 내가 RTN_ReplaceProbed에 대해 알고 있지만 명령 수준 계측이 필요하므로 jit 모드에서 핀을 사용해야합니다.

답변

7

기본적으로 모든 것을 시작할 수 있으므로 실제로 수정하기가 쉽습니다.

유일한 문제는 RTN_InsertCall을 호출 할 때 첫 번째 인수 만 추출한다는 것입니다 (Pin과 Actual이 첫 번째 인수에서는 동일하지만 다른 인수에서는 동일하지 않은 이유입니다). funcHandler가 필요한 모든 인수를 얻을 수 있도록 RTN_InsertCall에 몇 가지 인수를 추가하기 만하면됩니다.

그래서,

RTN_InsertCall(funcRtn, IPOINT_BEFORE, (AFUNPTR)funcHandler, 
    IARG_ADDRINT, "funcA", IARG_FUNCARG_ENTRYPOINT_VALUE, 
    0, IARG_END); 

그냥 할 대신 내가 한 모두는 당신이 이미 가지고 후, 1 차 및 2 차 인수를 얻기 위해 1과 2로 몇 가지 더 IARG_FUNCARG_ENTRYPOINT_VALUE를 추가

RTN_InsertCall(funcRtn, IPOINT_BEFORE, (AFUNPTR)funcHandler, 
    IARG_ADDRINT, "funcA", IARG_FUNCARG_ENTRYPOINT_VALUE, 
    0, IARG_FUNCARG_ENTRYPOINT_VALUE, 1, 
    IARG_FUNCARG_ENTRYPOINT_VALUE, 2, IARG_END); 

했다 0 번째 인수.

저는 현재 테스트를 위해 Pin을 설정 한 시스템에 없지만 작동하지 않으면 알려줍니다.

0

Tests/callargs.cpp의 예는 정확한 결과를 제공합니다.