【问题标题】:Setting a watch point in GDB在 GDB 中设置观察点
【发布时间】:2011-11-15 18:55:19
【问题描述】:

我正在操作一个庞大的代码库,并且想要监控特定变量的值(该变量深埋在其中一个文件中),尤其是当它被设置为零时。

1) 变量不属于全局范围。有没有比先在定义它的函数中设置断点然后设置观察点更好的选择?
2)在尝试了 1 中的选项后,我看到观察点在一段时间后被删除,说它使用了这个。这样它增加了过程的乏味,因为我必须一次又一次地添加它?有什么解决方法吗?
3) 有没有办法检查一个特定的变量是否等于 0(或任何特定的常数)?

【问题讨论】:

标签: debugging gdb watchpoint


【解决方案1】:

我假设您使用的是 Linux。你可以试试这个:

第一步是将变量设为静态,如:

static int myVar;

然后,在使用 -ggdb 编译代码后,您必须发现二进制文件中变量的地址,如下所示(我以真实案例为例):

readelf -s pdv | grep 时间 | c++filt

在我的情况下,输出是:

47: 081c1474 4 对象本地默认值 25 startProc(int)::tmp

本例中的地址是 081c1474。现在您可以在 GDB 中设置观察点:

观看 *0x081c1474

注意正确地址前的“*0x”。

我知道这个问题很老了,但无论如何我希望它有所帮助。

【讨论】:

    【解决方案2】:

    想要监控特定变量的值

    这通常不是最好的方法,尤其是在大型代码库中。

    您真正想做的是了解不变量,并断言它们在进入和退出代码的各个部分时为真。

    1) 变量不属于全局范围。有没有比先在定义它的函数中设置断点然后设置观察点更好的选择?

    没有。对于自动(堆栈)变量,您必须在变量“活动”的范围内。

    您可以做的是在某行设置断点,并将命令附加到将自动设置观察点的断点,例如

    (gdb) break foo.c:123
    (gdb) commands 1
          silent
          watch some_local
          continue
          end
    

    3) 有没有办法检查某个变量是否等于 0

    你不能用观察点做到这一点,但你可以用条件断点:

    (gdb) break foo.c:234 if some_local == 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      相关资源
      最近更新 更多