2011-10-25 70 views
3

我試圖獲得使用intel引腳的函數參數的值。使用ManualExamples/malloctrace.cpp示例的單參數函數非常簡單。但是,當我嘗試使用多個參數獲取參數值時,我遇到了麻煩。英特爾引腳RTN_InsertCall多個函數參數

例如,試圖捕捉下面的函數的參數值:

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

用下面的PIN碼

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: 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對於第一個參數而不是其他的相同)。你只需要給RTN_InsertCall多一些參數,這樣funcHandler就可以獲得它需要的所有參數。

所以,與其

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

只是做

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

我所做的只是添加一對夫婦更IARG_FUNCARG_ENTRYPOINT_VALUE 1和2中得到的第1和第2個參數,你已經有後第0個參數。

我目前沒有在Pin設置的機器上測試,但如果它不起作用,請告訴我。

0

Tests/callargs.cpp中的示例給出了正確的結果。

VOID funcA(ADDRINT a, ADDRINT b, ADDRINT c) { 
     printf("Pin: %i %i %i\n", (int)a, (int)b, (int)c); 
    } 


    RTN_InsertCall(startRtn, IPOINT_BEFORE, AFUNPTR(StartHandler), IARG_G_ARG0_CALLER, IARG_G_ARG1_CALLER, IARG_G_ARG2_CALLER, IARG_END);