【问题标题】: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