Когда gdb помечает переменную как «недоступную»?

#c #gdb

#c #gdb

Вопрос:

Я довольно новичок в GDB, и я еще не нашел похожий вопрос, и мои поиски в Google были напрасны, так что вот.

Я подключаюсь к удаленной плате на базе PowerPC через COM-порт, используя GDB, и я достиг точки останова. Вот мой (очень отредактированный) сеанс GDB.

 (gdb) where
#0 WaitForStuff () at graphfile.c:1234
#1 0x00012af4 in WaitForOtherStuff () at graph.c:2345
#2 0x001d0a7c in DrawScreens (DefaultScreenFct=0x2bef02 <DefaultFct>,
SecondScreenFct=0x2bef02 <DefaultFct>, DrawBothPages=Variable "DrawBothPages"
is not available.
[...]
(gdb)
  

Вот объявление функции во фрейме # 2 :

 void DrawScreens(void (*DefaultScreenFct)(void), void (*SecondScreenFct)(void),
const BOOLEAN DrawBothPages);
  

Вот тут я теряюсь: почему эта переменная «недоступна» и как я мог бы сделать ее «доступной»? Я скомпилировал программу с использованием GCC с переключателем -g3 на всякий случай, если мне понадобится дополнительная информация, но я получаю ту же ошибку. Я также удалил флаг -O, который мы использовали. Может ли это быть BOOLEAN typedef (просто unsigned char )? Или, возможно, const важность параметра? Мне кажется странным, что GDB даже не дала мне адрес, на который я мог бы посмотреть.

Спасибо!

Комментарии:

1. Попробуйте -O0 в качестве флага gcc. Это для «без оптимизации». Флаг No -O не обязательно означает, что оптимизация

2. Что говорит GCC о том, target: когда вы используете -v параметр.

3. После удаления оптимизации вы убедились, что файл был перекомпилирован? Инкрементная сборка, возможно, не вызвала перекомпиляцию.

4. @Michael Blurr : Target: powerpc-eabi какая цель является правильной.

Ответ №1:

-O включает оптимизацию в GCC (это эквивалентно -O1 ).

Вы хотите использовать -O0 для отключения оптимизации (и используется по умолчанию).

Кроме того, ABI PowerPC, вероятно, передает параметры в регистрах. Я не знаю, -O0 заставит ли GCC отразить аргумент в ячейке памяти стека в функции или нет.

Комментарии:

1. Виноват! Вот что я имел в виду: я удалил флаг -O, который был в моих CFLAGS, поэтому теперь я использую регистр по умолчанию. Я отредактирую свой вопрос, чтобы сделать это более понятным.

2. @SolarBear: не удаляйте ее. Укажите явно -O0 .

Ответ №2:

Обычно она находится в регистре и была очищена или переименована во что-то другое.

Комментарии:

1. Есть ли у вас какой-либо источник или материал, подтверждающий этот ответ? И есть ли какое-либо решение самой проблемы?

2. @SolarBear: исходя из опыта и документации о PPC и GDB, я могу поддержать его замечание.