我可以在GDB的“内存访问”中设置一个断点吗?

我正在通过gdb运行一个应用程序,我想设置一个断点,任何时候访问/更改一个特定的variables。 有这样做的好方法吗? 我也会对用C / C ++来监视variables的其他方式感兴趣,看看它是否/何时发生变化。

手表只有在写入时才打破,让你在读取时断开,并且让你在读/写上断开。

您可以在内存位置上设置读取的观察点:

gdb$ rwatch *0xfeedface Hardware read watchpoint 2: *0xfeedface 

但是一个限制适用于rwatch和awatch命令; 你不能在expression式中使用gdbvariables:

 gdb$ rwatch $ebx+0xec1a04f Expression cannot be implemented with read/access watchpoint. 

所以你必须自己扩展它们:

 gdb$ print $ebx $13 = 0x135700 gdb$ rwatch *0x135700+0xec1a04f Hardware read watchpoint 3: *0x135700 + 0xec1a04f gdb$ c Hardware read watchpoint 3: *0x135700 + 0xec1a04f Value = 0xec34daf 0x9527d6e7 in objc_msgSend () 

编辑:哦,顺便说一句。 您需要硬件或软件支持 。 软件显然要慢得多。 要了解您的操作系统是否支持硬件观察点,您可以看到can-use-hw-watchpoints环境设置。

 gdb$ show can-use-hw-watchpoints Debugger's willingness to use watchpoint hardware is 1. 

假设第一个答案是指类似C的语法(char *)(0x135700 +0xec1a04f)那么执行rwatch *0x135700+0xec1a04f是不正确的。 正确的语法是rwatch *(0x135700+0xec1a04f)

那里()的缺乏给我带来很大的痛苦,试图自己使用观察点。

你在找什么叫做观察点

用法

(gdb) watch foo :观察variables foo的值

(gdb) watch *(int*)0x12345678 :观察地址指向的值,转换成任何你想要的types

(gdb) watch a*b + c/d :观看一个任意复杂的expression式 ,在程序的母语中是有效的

观察点有三种:

  • 注意 :发生写操作时,gdb将会中断
  • rwatch :gdb将会中断读取
  • awatch :在这两种情况下 gdb都会中断

你可以select更适合你的需求。

欲了解更多信息,请查看。

我只是尝试了以下内容:

  $ cat gdbtest.c int abc = 43; int main() { abc = 10; } $ gcc -g -o gdbtest gdbtest.c $ gdb gdbtest ... (gdb) watch abc Hardware watchpoint 1: abc (gdb) r Starting program: /home/mweerden/gdbtest ... Old value = 43 New value = 10 main () at gdbtest.c:6 6 } (gdb) quit 

所以这似乎是可能的,但你似乎需要一些硬件支持。

如上所述,使用watch来查看variables被写入的时间,读取时的rwatch以及读取/写入时的awatch。 但是,请注意,要使用这个命令,你必须打破这个程序,并且当你打破这个程序时,这个variables必须在范围之内:

使用watch命令。 watch命令的参数是一个被评估的expression式。 这意味着你想设置观察点的variables必须在当前范围内。 所以,要设置一个非全局variables的观察点,你必须设置一个断点,当variables在范围内时,它将停止你的程序。 在程序中断后设置观察点。