Debugging 在GDB中设置监视点

Debugging 在GDB中设置监视点,debugging,gdb,watchpoint,Debugging,Gdb,Watchpoint,我正在运行一个庞大的代码库,希望监视一个特定变量的值(它被深埋在一个文件中),尤其是当它被设置为零时 1) 变量不属于全局范围。是否有比先在定义它的函数中设置断点,然后设置观察点更好的选项? 2) 在尝试了1中的选项后,我看到监视点在使用此选项的帧外时被删除。这种方式增加了过程的繁琐性,因为我必须一次又一次地添加它?有解决方法吗? 3) 有没有办法检查ie watch某个特定变量是否等于0(或任何特定常数) 要监视特定变量的值吗 通常这不是最好的方法,尤其是在大型代码库中 您可能真正想做的是理解

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

1) 变量不属于全局范围。是否有比先在定义它的函数中设置断点,然后设置观察点更好的选项?
2) 在尝试了1中的选项后,我看到监视点在使用此选项的帧外时被删除。这种方式增加了过程的繁琐性,因为我必须一次又一次地添加它?有解决方法吗?
3) 有没有办法检查ie watch某个特定变量是否等于0(或任何特定常数)

要监视特定变量的值吗

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

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

1) 变量不属于全局范围。是否有比先在定义它的函数中设置断点,然后设置监视点更好的选项

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

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

(gdb) break foo.c:123
(gdb) commands 1
      silent
      watch some_local
      continue
      end
3) 有没有办法检查ie watch某个特定变量是否等于0

不能使用观察点,但可以使用条件断点:

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

我假设您正在使用Linux。您可以尝试以下方法:

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

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

readelf-s pdv|grep tmp|c++filt

在我的情况下,输出是:

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

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

观看*0x081c1474

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

我知道这个问题很老,但我希望它能有所帮助。

局部变量部分的可能重复,变量等于0部分