2011-10-25 16 views
3

intelピンを使用して関数の引数の値を取得しようとしています。単一引数関数は、例ManualExamples/malloctrace.cppを使用するだけで十分簡単です。しかし、複数の引数で引数の値を取得しようとすると、問題が発生します。intelピンRTN_InsertCall複数の関数の引数

例:私は次の出力

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 

を取得し、以下のピンコード

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); 
    } 
} 

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

私は近くだと見ることができます。次の関数の引数の値を捕獲しようとしています何かが正しく整列していない。私は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との夫婦より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番目の引数。

私はピンのテストを設定したマシンにいませんが、動作しない場合は教えてください。

0

Tests/callargs.cppの例では、正しい結果が得られます。

関連する問題