0

我已经捕获了由英特尔 PIN 运行的程序的读取内存跟踪(即所有读取访问的地址),ASLR已关闭。我可以捕捉它几次,痕迹仍然完全一样。

然后我从跟踪中获取一个地址(我感兴趣的特定地址),在 GDB 中设置一个观察点,rwatch *0x7fffe309e643但 GDB 没有注意到访问。我在进行跟踪的同一终端中执行此操作,因此它应该访问相同的地址;当我再次捕获它时,痕迹仍然非常相同。

你有什么想法或提示为什么 GDB 没有抓住它?

我必须注意,访问很可能发生在从 Boost 序列化加载的(C++)结构中,并且代码已经用-g3 -O1标志编译(-O1由于其他原因确实很重要,但一个最小的例子向我展示了 GDB 正确地中断了-O1) .

更新:

正如建议的那样,我尝试了 PIN 调试器(它实际上利用了 GDB),但观察点存在一些问题。为了提出这个问题,我做了一个最小的例子。

int main()
{
  unsigned char i = 4;
  i++;
  i = 3;
  return 0;
}

我使用 PIN 获得了读取内存跟踪,并选择0x7fffffffd89f(或类似)作为感兴趣的地址。然后我在并行终端中启动了 PIN 调试器和 GDB,并将 GDB 连接到 PIN((gdb) target remote :57946如 PIN 所建议的那样)。在 GDB 中,我设置了观察点(gdb) rwatch *0x7fffffffd89f并开始执行,但我得到了

Continuing.
Warning:
Could not insert hardware watchpoint 1.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.

即使我只插入了一个观察点。我还尝试显式禁用硬件断点,set can-use-hw-watchpoints 0但它运行了一个小时,没有结果,也没有处理器负载,所以我把它杀了。

当 GDB 连接到 PIN 调试器时,还有其他方法如何在特定地址设置功能观察点吗?请注意,独立 GDB 没有这样的问题。

我使用 GDB 7.7.1、PIN 2.14-71313 和 GCC 4.4.7,运行 Ubuntu 14.04。

原来的问题可能会在那时得到解决。

4

1 回答 1

1

来自 pin用户指南

The "pin" Executable (Launcher)

The kit's root directory contains a "pin" executable. This is a 32-bit
launcher, used for launching Pin in 32 and 64 bit modes. The launcher
sets up the environment to find the libraries supplied with the kit.

运行时很可能环境不同pinbin,因此即使没有 ASLR,堆栈地址也会有所不同(0x7fffe309e643看起来像是可能的堆栈地址)。

您最好的选择可能是使用 Pin应用程序调试接口。

于 2016-01-12T04:13:46.867 回答