我已经捕获了由英特尔 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。
原来的问题可能会在那时得到解决。