#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, я могу поддержать его замечание.