在GDB中设置监视点

时间:2011-09-13 01:31:32

标签: debugging gdb watchpoint

我正在运行一个巨大的代码库,并希望监视某个特定变量的值(它深埋在其中一个文件中),尤其是当它设置为零时。

1)变量不属于全局范围。是否有一个更好的选择,而不是首先将断点设置到定义它的函数中,然后设置观察点?
2)在1中尝试选项之后,我看到一段时间之后它被删除,并且说它的帧外使用了它。这种方式会增加程序的繁琐程度,因为我必须一次又一次地添加它?任何变通方法?
3)有没有办法检查,即观察特定变量是否等于0(或任何特定常数)?

2 个答案:

答案 0 :(得分:8)

  

想要监控特定变量的值

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

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

  

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

答案 1 :(得分:-1)

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

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

static int myVar;

然后,在使用-ggdb编译代码之后,必须在二进制文件中发现变量的地址,就像这样(我使用了一个真实案例作为示例):

readelf -s pdv | grep tmp | C ++ FILT

在我的情况下,输出是:

47:081c1474 4 OBJECT LOCAL DEFAULT 25 startProc(int):: tmp

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

观看* 0x081c1474

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

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