c++ - 具有 PinPlay RTN_InsertCall 回调的英特尔 Pin 未在重放时执行

标签 c++ intel intel-pin

我将英特尔的 Pin API 与 Pinplay 重放框架一起使用,但在执行重放时无法执行以下命令:

VOID Arg1Before(char *name, ADDRINT arg1) {
  tracefile << name << "(" << arg1 << ")" << endl;
}

VOID Routine(RTN rtn, VOID *v) {
  RTN_Open(rtn);
  if (RTN_Name(rtn) == "malloc") {
    RTN_InsertCall(rtn, IPOINT_BEFORE, (AFUNPTR)Arg1Before,
                   IARG_ADDRINT, "malloc",
                   IARG_FUNCARG_ENTRYPOINT_VALUE, 0,
                   IARG_END); 
  }
  RTN_Close(rtn);
}

这在功能上类似于 Pin 的 SimpleExamples/malloctrace.cpp 示例程序。

正在重播的弹球是用以下方法创建的:

$PIN_ROOT/pin -t $PIN_ROOT/extras/pinplay/bin/intel64/pinplay-malloctracer.so \
    -log -log:basename pinball/foo -- /usr/bin/ls

重放使用:

$PIN_ROOT/pin -xyzzy -reserve_memory pinball/foo.address \
    -t $PIN_ROOT/extras/pinplay/bin/intel64/pinplay-malloctracer.so \
    -replay -replay:basename pinball/foo \
    -- ../pin-2.14/extras/pinplay/bin/intel64/nullapp

调试显示 Routine() 被正确调用,但插入的调用从未被执行。

我的操作系统是 RHEL。

最佳答案

我遇到了同样的问题,得到了答案here ,如果你使用 python 脚本来记录程序,你只需要为它提供 -log:image_ops 选项。它会像

$pinpoints.py --cfg test.cfg --log_options="-log:image_ops" -l 

另请检查您的常规检测功能。我觉得应该是

RTN_Name(rtn) == "__libc_malloc"

关于c++ - 具有 PinPlay RTN_InsertCall 回调的英特尔 Pin 未在重放时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34725860/

相关文章:

c++ - 如何在 C++ 中将二维数组转换为单个字符串

c++ - 为多平台编译时围绕未定义行为的混淆

c++ - 更高的核心负载 Intel TBB

android - 如何确保我的 Android 应用程序在英特尔手机上运行?

android - 将 phonegap/cordova 项目导入 Intel XDK

c++ - std::variant 是否提供类似于 boost::variant<>::types 的功能?

具有复数的 C++ FFTW(快速傅里叶变换)

c++ - 如何获取 Pin 中存储指令写入的值?

c++ - 英特尔引脚 : analysis routine detects ah register instead of rsp (REG_STACK_PTR)

c++ - Pin工具中调用函数时出现段错误