我正在操作一个庞大的代码库,并希望监视特定变量的值(该变量深埋在其中一个文件中),尤其是当它设置为零时。
1)变量不属于全局范围。有没有比首先在定义它的函数中设置断点然后设置观察点更好的选择?
2)在尝试了 1 中的选项后,我看到观察点在一段时间后被删除,说它使用了这个。这样它增加了过程的乏味,因为我必须一次又一次地添加它?有什么解决方法吗?
3)有没有办法检查一个特定的变量是否等于0(或任何特定的常数)?
我正在操作一个庞大的代码库,并希望监视特定变量的值(该变量深埋在其中一个文件中),尤其是当它设置为零时。
1)变量不属于全局范围。有没有比首先在定义它的函数中设置断点然后设置观察点更好的选择?
2)在尝试了 1 中的选项后,我看到观察点在一段时间后被删除,说它使用了这个。这样它增加了过程的乏味,因为我必须一次又一次地添加它?有什么解决方法吗?
3)有没有办法检查一个特定的变量是否等于0(或任何特定的常数)?
想要监视特定变量的值
这通常不是最好的方法,尤其是在大型代码库中。
您真正可能想要做的是理解不变量,并断言它们在进入和退出代码的各个部分时是正确的。
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
我将假设您使用的是 Linux。你可以试试这个:
第一步是使变量静态,如:
static int myVar;
然后,在使用 -ggdb 编译代码后,您必须发现二进制文件中变量的地址,如下所示(我使用了一个真实案例作为示例):
readelf -s pdv | grep 时间 | c++filt
在我的情况下,输出是:
47: 081c1474 4 对象本地默认值 25 startProc(int)::tmp
本例中的地址是 081c1474。现在您可以在 GDB 中设置观察点:
手表 *0x081c1474
注意正确地址前的“*0x”。
我知道这个问题很老,但我希望它无论如何都会有所帮助。