【问题标题】:memory access trace using pin tool使用 pin 工具的内存访问跟踪
【发布时间】:2016-02-10 13:32:54
【问题描述】:

我只是在使用英特尔的 pin 工具时遇到了问题。我想要一个 c++ 程序的内存访问跟踪,并为此使用它。首先,我使用

运行 c++ 程序 (./a.out)
../../../pin -t obj-intel64/pinatrace.so -- ./a.out

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

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

【问题讨论】:

    标签: profiling intel-pin


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 那么就没有办法输出程序的内存访问轨迹了吗?
    • 这是一个内存访问跟踪。它包含的内容比您想象的要多。
    • 在检测期间,您可以查看 TRACE 的 IMG 以过滤掉属于运行时一部分的图像(例如 libc.so)的跟踪。您可以在 InstLibExamples/filter.cpp 中查看如何使用 InstLib 执行此操作的示例。查看 InstLib/filter.cpp 代码,看看它是如何完成的。
    猜你喜欢
    • 2017-07-18
    • 2012-12-15
    • 1970-01-01
    • 2015-08-04
    • 2017-02-04
    • 2010-12-13
    • 2017-08-25
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多