【问题标题】:memory trace of all variables in program with DBI tool使用 DBI 工具对程序中所有变量的内存跟踪
【发布时间】:2017-08-25 10:01:19
【问题描述】:

我使用 intel pin 作为我的主要 DBI 工具。 我很想知道如何跟踪程序中分配的所有变量。

假设,我们在 C 中有以下 sn-p:

int *ptr_one, *ptr_two, g;
ptr_one = (int *)malloc(sizeof(int));
ptr_two = (int *)malloc(sizeof(int));
*ptr_one = 25;
*ptr_two = 24;
g = 130;
free(ptr_two);
g = 210;
*ptr_two = 50;

我想知道如何在我的程序中跟踪特定变量/内存引用。例如在上面的代码中,我喜欢用 Intel Pin 在我的程序中跟踪变量“g”,如何实现?

对于动态分配的变量,我正在监视 malloc/free 调用并跟踪它们的地址,但对于静态变量我不知道。

另外一点,对于动态分配的变量,我喜欢在整个程序中跟踪它们,假设在上面的代码中,我想在我的程序从头到尾监控(ptr_two)变量的变化和修改。

如果有人对此有所了解,可以在这里分享,英特尔 Pin 中的示例代码表示赞赏。

谢谢大家。

【问题讨论】:

    标签: memory memory-profiling intel-pin


    【解决方案1】:

    简单地说,您不能将源代码中的名称(变量或函数名称)与已编译二进制文件上的内存位置相关联:此信息(可能)在最终二进制文件中丢失。

    这在两种情况下是不正确的:

    1) 如果您的二进制文件正在导出函数:在这种情况下,其他二进制文件必须能够按名称调用函数(减去一些细微之处),在这种情况下,信息必须在某处可用;例如在 Windows 上,导出函数、变量或类的二进制文件有一个导出表。

    2)您有符号信息:在您的示例中,对于全局变量或其他局部变量,您必须使用编译器提供的符号信息。

    在 Linux 上,您将需要一个外部工具/库/程序(例如 libelf.so 或 libdwarf.so)来解析符号表(通常是 dynsym / symtab)中的符号信息如果二进制文件没有被剥离。

    在 Windows 上,您必须依赖程序数据库(*.pdb 文件);格式大多未记录(尽管 MS 是 trying to document it),您必须使用 DbgHelp APIDIA SDK

    正如PIN user guide 所述(重点是我的):

    Pin 使用符号对象 (SYM) 提供对函数名称的访问。 符号对象仅提供有关函数符号的信息 应用程序。 有关其他类型符号的信息(例如数据 符号),必须由工具独立获取

    如果您有符号信息,则可以将变量名(从外部工具获得)与地址(相对于全局变量的模块库或本地变量的堆栈位置)关联起来。在运行时,只需将相对地址转换为虚拟地址即可。

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 2021-01-14
      • 1970-01-01
      • 2011-06-15
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2011-03-18
      相关资源
      最近更新 更多