2010-09-21 28 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

相關問題