Memory 使用DBI工具对程序中所有变量的内存跟踪

Memory 使用DBI工具对程序中所有变量的内存跟踪,memory,memory-profiling,intel-pin,Memory,Memory Profiling,Intel Pin,我使用intel pin作为我的主要DBI工具。 我想知道如何跟踪程序中分配的所有变量 假设在C中有以下代码段: 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作为我的主要DBI工具。 我想知道如何跟踪程序中分配的所有变量

假设在C中有以下代码段:

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中的示例代码非常受欢迎


谢谢大家。

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

有两种情况并非如此:

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

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

在Linux上,如果二进制文件未剥离,则需要外部工具/库/程序(例如libelf.so或libdwarf.so)来解析符号表中的符号信息(通常为dynsym/symtab)

在windows上,您必须依赖程序数据库(*.pdb文件);该格式大部分是未记录的(尽管MS是),您必须使用或

正如报告所述(重点是我的):

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

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