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