debugging - with - gdb进入断点




我可以在GDB的“内存访问”中设置断点吗? (4)

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


手表只有在写入时才打破, 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.

你在找什么叫做观察点

用法

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

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

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

观察点有三种:

  • 观看 :发生写入时gdb将会中断
  • rwatch :gdb会在读取发生时中断
  • awatch :在这两种情况下 gdb都会中断

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

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


如上所述,使用watch来查看变量的写入时间,读取时的rwatch以及读取/写入时的awatch。 但是,请注意,要使用此命令,必须中断程序,并且在断开程序时变量必须在范围内:

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


我只是尝试了以下内容:

 $ 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

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







breakpoints