2010-09-21 25 views
17

在gdb中调试C程序时,我在for循环中有一个断点。我无法打印“我”的值(我在当前上下文中得到:无符号“i”)。我可以打印所有其他变量的值。这是正常的吗?gdb:当前上下文中没有符号“i”

这里是循环:

for (i=0; i < datasize; i++){ 
    if (feature_mask[i] > 0){ 
     k = feature_mask[i] - 1; 
     if (neighbors[k][nmax-1] != 0){ 
      neighbors[k][nmax-1] = bvalue; 
      feature_mask[i] = -feature_mask[i]; 
     } 
    } 
} 

感谢

回答

19

它可能已经优化了编译后的代码,因为你只在循环中使用feature_mask[i]

您是否在调用编译器时指定了优化级别?如果您使用的是gcc,那么只需省略任何-O选项并再试一次。

4

确保程序编译不优化和调试激活的信息。循环计数器很可能以寄存器结尾。

2

检查您的优化选项。 GCC可以用一个指向feature_mask的指针代替变量。

3

您可以尝试声明我为volatile。这将阻止一些编译器优化(并且希望在调试器内部可见i)。

+12

这是愚蠢的。不要总结优化 - 总是编译时没有进行调试优化(除非在极少情况下,一个bug只会以优化表​​现 - 但这是另一回事)。 – 2010-09-21 09:54:10

+1

我同意丹尼尔。 +1对他的评论 – pmg 2010-09-21 10:11:15

16

我最近遇到这个问题。我编译了GCC 5.1,然后用它来编译C++ 11代码库。而且,尽管我可以通过gdb中的程序代码,但我无法打印任何变量的值,我一直得到“当前上下文中没有符号“xyz””错误,对于每个变量。

我使用的是gdb 7.4,但是当时最新的版本是7.9。我下载了最新版本的gdb并编译了它(使用GCC 5.1),并且在使用gdb 7.9时,我能够再次成功检查变量值。

我猜GCC 5.1的调试信息与gdb 7.4不兼容。

+1

的确,请参阅[本答案](http://stackoverflow.com/a/15051109/673852)。 – Ruslan 2016-04-11 16:29:03

相关问题