英特尔引脚 RTN_InsertCall 多个函数参数

发布于 2024-12-11 22:13:57 字数 999 浏览 0 评论 0原文

我正在尝试使用 intel pin 获取函数的参数值。使用示例 ManualExamples/malloctrace.cpp ,单参数函数非常简单。但是,当我尝试使用多个参数获取参数值时,我遇到了麻烦。

例如。尝试捕获以下函数的参数值:

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 模式下使用 pin,因为我需要指令级检测。

I'm trying to obtain the values of the arguments to a function using intel pin. Single argument functions are simple enough using the example ManualExamples/malloctrace.cpp . However, when I try to get the argument values with multiple arguments I run into trouble.

Eg. Trying to capture the argument values of the following function:

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

With the following pin code

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

I get the following output

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

I can see that I'm close, but something isn't aligned properly. I know about RTN_ReplaceProbed, but I need to use pin in jit mode as I need instruction level instrumentation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜光 2024-12-18 22:13:57

我认为这实际上是一个很容易修复的问题,因为你基本上一开始就已经做好了一切。

唯一的问题是,当调用 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);

在获得第 0 个参数之后,我所做的不仅仅是添加几个带有 1 和 2 的 IARG_FUNCARG_ENTRYPOINT_VALUE 来获取第 1 个和第 2 个参数

我目前不在设置 Pin 进行测试的机器上,但如果它不起作用,请告诉我。

I think it's actually a pretty easy one to fix, since you've basically got everything right to begin with.

The only problem is that when calling RTN_InsertCall, you only extract the first argument (which is why Pin and Actual are the same for the first argument but not the others). You simply need to give a few more arguments to RTN_InsertCall so that funcHandler gets all the arguments it needs.

So, instead of

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

just do

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

All I did was add a couple more IARG_FUNCARG_ENTRYPOINT_VALUE with 1 and 2 to get the 1st and 2nd arguments, after you already got the 0th argument.

I'm currently not on the machine where I have Pin set up to test, but if it doesn't work let me know.

老子叫无熙 2024-12-18 22:13:57

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

The example in Tests/callargs.cpp gives correct results.

   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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文