我已经捕获了由英特尔PIN运行的程序的读取存储器跟踪(即所有读取访问的地址),ASLR关闭。我可以多次捕捉它并且痕迹仍然完全相同。
然后我从跟踪中获取一个地址(我感兴趣的特定地址),在{GDB rwatch *0x7fffe309e643
中设置一个观察点,但GDB没有注意到该访问。我在已经采用跟踪的同一终端中执行此操作,因此它应该访问相同的地址;当我再次捕捉它时,痕迹仍然非常相同。
你有任何想法或提示,为什么GDB没有抓住它?
我必须注意,访问很可能发生在从Boost序列化加载的(C ++)结构中,并且代码已经使用-g3 -O1
标志进行编译(-O1
因其他原因而非常重要但是一个最小的例子告诉我,即使使用-O1
),GDB也能正确破坏。
更新
正如所建议的那样,我尝试了PIN调试器(它实际上使用了GDB)但是观察点存在一些问题。为了解决这个问题,我做了一个最小的例子。
int main()
{
unsigned char i = 4;
i++;
i = 3;
return 0;
}
我使用PIN获取了读取内存跟踪,并选择0x7fffffffd89f
(或类似)作为感兴趣的地址。然后我在并行终端中启动了PIN调试器和GDB,并按照PIN的建议将GDB连接到PIN((gdb) target remote :57946
)。在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。
原来的问题很可能会解决。
答案 0 :(得分:1)
来自user guide针:
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 application debugging界面。