我使用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;
我想知道如何在程序中跟踪特定变量/内存引用。例如,在上面的代码中,我喜欢用我的程序跟踪英特尔Pin中的变量“g”,怎么做?
对于动态分配的变量,我正在监控malloc / free calls&按照他们的地址,但对于静态地址,我不知道。
另一个问题是,对于动态分配的变量,我喜欢在整个程序中跟踪它们,假设在上面的代码中,我想在程序中从头到尾监视(ptr_two)变量和修改。
如果有人对此有所了解,可以在此处分享,在英特尔Pin中感谢示例代码。
谢谢大家。
答案 0 :(得分:0)
简单地说,您不能将源代码中的名称(无论是变量还是函数名称)与已编译二进制文件的内存位置相关联:此信息(可能)在最终二进制文件中丢失。
在两种情况下不是这样:
1)如果您的二进制文件正在导出函数:在这种情况下,其他二进制文件必须具有通过名称调用函数的方法(减去一些细微之处),在这种情况下,信息必须在某处可用;例如,在Windows上,导出函数,变量或类的二进制文件具有导出表。
2)您有符号信息:在您的示例中,无论是全局变量还是其他局部变量,您都必须使用编译器提供的符号信息。
在Linux上,你需要一个外部工具/库/程序(例如libelf.so或libdwarf.so)来解析符号表中的符号信息(通常是dynsym / symtab)如果二进制文件没有被剥离< /强>
在Windows上你必须依赖程序数据库(* .pdb文件);格式大多没有记录(虽然MS是trying to document it),您必须使用DbgHelp API或DIA SDK。
正如PIN user guide所述(强调是我的):
Pin使用符号对象(SYM)提供对函数名称的访问。 符号对象仅提供有关函数符号的信息 应用程序。 有关其他类型符号的信息(例如数据 符号),必须由工具独立获得。
如果您有符号信息,则可以将变量名称(从外部工具获取)与地址(相对于全局变量的模块库或本地变量的堆栈位置)相关联。在运行时,只需将相对地址转换为虚拟地址即可。