Подтвердить что ты не робот

Gdb: Нет символа "i" в текущем контексте

При отладке программы C в gdb у меня есть точка останова в цикле for. Я не могу напечатать значение "i" (я получаю: нет символа "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];
        }
    }
}

Спасибо

4b9b3361

Ответ 1

Вероятно, он оптимизирован из вашего скомпилированного кода, поскольку вы используете только feature_mask[i] в цикле.

Вы указали уровень оптимизации при вызове своего компилятора? Если вы использовали gcc, просто опустите любые опции -O и повторите попытку.

Ответ 2

Недавно я столкнулся с этой проблемой. Я скомпилировал GCC 5.1, а затем использовал его для компиляции кодовой базы С++ 11. И хотя я мог бы выполнить программный код в gdb, я не смог распечатать значение любой переменной, я продолжал получать ошибки "Нет символов" xyz "в текущем контексте" для каждой переменной.

Я использовал gdb 7.4, но последняя версия, доступная в то время, была 7.9. Я загрузил последнюю версию gdb и скомпилировал ее (используя GCC 5.1), а при использовании gdb 7.9 мне удалось успешно проверить значения переменных снова.

Я думаю, что отладочная информация GCC 5.1 несовместима с gdb 7.4.

Ответ 3

Убедитесь, что программа скомпилирована без оптимизации и с включенной информацией об отладке. Весьма вероятно, что счетчик циклов попадает в регистр.

Ответ 4

Вы можете попробовать объявить я как volatile. Это предотвратит некоторые оптимизации компилятора (и, надеюсь, сделает i видимым внутри отладчика).

Ответ 5

Проверьте параметры оптимизации. Возможно, GCC может заменить переменную указателем на feature_mask.