2011-09-13 87 views
2

我正在操作一个庞大的代码库,并且希望监视某个特定变量(它被深埋在其中一个文件内)的值,尤其是当它被设置为零时。在GDB中设置观察点

1)变量不属于全局范围。是否有更好的选择,而不是首先将断点设置到定义它的函数中,然后设置观察点?
2)在尝试1中的选项后,我发现观察点会在一段时间后被删除,说明它使用了这个框架。这种方式增加了程序的繁琐性,因为我必须一次又一次地添加它。解决方法?
3)有没有办法检查即观察特定变量是否等于0(或任何特定的常量)?

+0

的可能的复制[如何设置本地范围的变量持久的和有条件的观察点?(http://stackoverflow.com/questions/1354637/how-do-i-set-persistent-and-conditional-watchpoints-局部变量部分),以及变量等于0部分的http://stackoverflow.com/questions/14390256/gdb-break-if-variable-equal-value –

回答

6

想监视特定变量

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

你真正想要做的是理解不变式,并声明它们在进入和退出代码的各个部分时是真实的。

1)变量不属于全局作用域。是否有更好的选择,而不是首先将断点设置到定义它的函数中,然后设置观察点?

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

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

(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

我会假设你正在使用Linux。你可以试试这个:

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

static int myVar; 

然后,使用-ggdb编译代码后,你必须发现里面的二进制变量的地址,像我这样(我用一个真实案例为例):

readelf -s pdv | grep tmp | C++ FILT

以我的情况下,输出为:

47:081c1474 4 OBJECT本地默认25参见startproc(INT):: TMP

在这种情况下,地址是081c1474。现在,您可以设置观测点内GDB:

手表* 0x081c1474

心灵正确的地址前加 “* 0X”。

我知道这个问题是旧的,但我希望它能帮助呢。