我可以在GDB中的'内存访问'上设置断点吗?

时间:2008-09-12 12:46:28

标签: debugging gdb breakpoints

我正在通过gdb运行应用程序,我希望在访问/更改特定变量的任何时候设置断点。有这么好的方法吗?我也有兴趣用其他方法来监视C / C ++中的变量,看看它是否/何时发生变化。

5 个答案:

答案 0 :(得分:263)

watch 只在写入时中断, rwatch 让你在读取时中断, awatch 让你在读/写时中断。

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

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

但是一个限制适用于rwatch和awatch命令;你不能使用gdb变量 在表达式中:

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.

答案 1 :(得分:23)

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

缺少()导致我自己尝试使用观察点时感到非常痛苦。

答案 2 :(得分:22)

您正在寻找的内容称为观察点

用法

(gdb) watch foo:观看变量的值 foo

(gdb) watch *(int*)0x12345678:观察地址指向的值,投放到您想要的任何类型

(gdb) watch a*b + c/d:观看任意复杂表达,在该程序的母语中有效

观察点有三种:

  • 观看:当发生时,gdb会中断
  • rwatch :gdb会破坏读取
  • awatch :gdb将在两种情况下中断

您可以选择更适合您的需求。

有关详情,请查看this

答案 3 :(得分:9)

我刚刚尝试了以下内容:

 $ 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

所以看起来可能,但你似乎确实需要一些硬件支持。

答案 4 :(得分:2)

使用watch查看变量的写入时间,rwatch在读取时读取,并在读取/写入变量时进行唤醒,如上所述。但请注意,要使用此命令,必须中断程序,并且当您破坏程序时变量必须在范围内:

  

使用watch命令。 watch命令的参数是   被评估的表达式。这意味着你想要的变量   设置观察点必须在当前范围内。所以,设置一个   关于非全局变量的观察点,您必须设置断点   这将在变量在范围内时停止程序。你设置了   程序休息后的观察点。