使用 pin 工具的内存访问跟踪

memory access trace using pin tool

我在使用英特尔的 pin 工具时遇到了问题。我想要一个 C++ 程序的内存访问跟踪,为此正在使用它。首先我 运行 c++ 程序 (./a.out) 使用

../../../pin -t obj-intel64/pinatrace.so -- ./a.out

现在在c++中我也打印了每个变量的地址。现在,当我用文件输出的实际变量名替换由 pin 生成的文件中的所有地址时,它给出了错误的序列。

例如,对于添加变量 'a' 和 'b' 并将结果存储在 'c' 并打印在控制台上的求和程序(只是一小段 5 行代码),在pin 'b' 生成的文件存在 150 次,'a' 存在 33 次,'c' 存在 3 次。但在代码中,所有变量的引用不超过两次。我怎样才能得到实际的内存访问跟踪。任何人都可以帮助我,我将非常感激。

堆栈上的内存地址被多次使用一点也不奇怪。 考虑以下代码:

int main() {
  {
    int a = 0;
  }
  {
    int b = 0;
  }
}

如果赋值不被优化掉,我几乎可以保证这两个赋值会被分配到同一个内存地址。

现在考虑这样一个事实,即在您的代码执行之前和可能之后,有相当多的运行时初始化,并且应该清楚为什么您所看到的完全符合预期。

您可以使用 InstLibExamples/filter.cpp 中提供的示例来了解如何过滤掉某些 IMG 的内存跟踪。