gpt4 book ai didi

c++ - intel pin RTN_InsertCall 多个函数参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:34 25 4
gpt4 key购买 nike

我正在尝试使用英特尔引脚获取函数的参数值。使用示例 ManualExamples/malloctrace.cpp ,单参数函数就足够简单了。但是,当我尝试使用多个参数获取参数值时,我遇到了麻烦。

例如。 try catch 以下函数的参数值:

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

使用以下密码

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,因为我需要指令级检测。

最佳答案

我认为这实际上是一个非常容易修复的问题,因为您基本上已经准备好了一切。

唯一的问题是调用 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 进行测试的机器上,但如果它不起作用请告诉我。

关于c++ - intel pin RTN_InsertCall 多个函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com