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

有帮助吗?

解决方案

手表 仅在写入时中断, 手表 让你继续阅读,并且 一只手表 让你在读/写时中断。

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

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 ()

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

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:观察值 多变的 foo

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

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

观察点分为三种:

  • 手表:gdb 将在以下情况中断: 发生
  • 手表:gdb 将中断 发生
  • 一只手表:gdb将闯入 两种情况

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

欲了解更多信息,请检查 出去。

我刚刚尝试了以下操作:

 $ 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 来查看变量何时被写入,rwatch 何时被读取,awatch 何时被读取/写入,如上所述。但是,请注意,要使用此命令,您必须中断程序,并且当您中断程序时变量必须在范围内:

使用监视命令。手表命令的论点是评估的表达式。这意味着您要设置一个观察点的变量必须在当前范围内。因此,要在非全球变量上设置一个观察点,您必须设置一个断点,该断点将在变量处于范围中时停止程序。程序中断后,您将观看点设置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top