我正在运行一个巨大的代码库,并希望监视某个特定变量的值(它深埋在其中一个文件中),尤其是当它设置为零时。
1)变量不属于全局范围。是否有一个更好的选择,而不是首先将断点设置到定义它的函数中,然后设置观察点?
2)在1中尝试选项之后,我看到一段时间之后它被删除,并且说它的帧外使用了它。这种方式会增加程序的繁琐程度,因为我必须一次又一次地添加它?任何变通方法?
3)有没有办法检查,即观察特定变量是否等于0(或任何特定常数)?
答案 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”。
我知道这个问题很老,但我希望无论如何都会有所帮助。