1

我将 Intel 的 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。

4

1 回答 1

0

我遇到了同样的问题,在这里得到了答案,如果您使用 python 脚本来记录程序,您只需要为其提供 -log:image_ops 选项。会是这样的

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

还请检查您的常规仪器功能。我认为应该是

RTN_Name(rtn) == "__libc_malloc"
于 2016-01-24T00:44:38.100 回答