0

我使用 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 中的示例代码很受欢迎。

谢谢你们 。

4

1 回答 1

0

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

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

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

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

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

在 Windows 上,您必须依赖程序数据库(*.pdb 文件);该格式大多未记录(尽管 MS 正在尝试记录它),您必须使用DbgHelp APIDIA SDK

PIN 用户指南所述(重点是我的):

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

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

于 2017-04-02T13:02:45.853 回答