Я в растерянности здесь. Я пишу компилятор на C (для хобби) и компилирую с GCC 4.6.1 на amd64 Linux 2.6.32, используя GDB 7.3. Флаги "-Wall -Wextra -O0 -g", в дополнение к обычным -I и еще много чего. У меня есть функция, целью которой является сообщить об ошибке разбора, определенная следующим образом:
void cerror_at (struct lex *lex, struct token *tok, const char *fmt, ...)
Кроме того, что ты вариад, ничего странного. Проблема в том, что ГБД НЕ сломается. Я пробовал все возможные способы (точка останова в функции, внутри функции, прежде чем она вызывается, вы называете ее), но как только моя программа находится внутри функции, я получаю сообщения типа «предупреждение: ошибка при удалении точки останова» 0 "и GDB просто позволяет программе закончить. В этом больше нет ничего плохого (с тех пор я исправил ошибку, которую пытался найти, и все работает как надо), но я не могу войти в функцию. Любые идеи о том, что может вызвать это?
Редактировать: Больше информации! GDB устанавливает точку останова на 0x403057. Функция начинается с 0x403025. Посмотрите на эту часть разборки:
0x0000000000403053 <+46>: test %al,%al
0x0000000000403055 <+48>: je 0x403077 <cerror_at+82>
В этот момент он переходит вперед к 0x403077 (после точки останова). Я проверил, что размещение точки останова по адресу до «je» работает, а также по адресу 0x403077 или после него, цель перехода, но не между (где GDB пытается его разместить). Зачем GDB размещать точку останова в середине функции? Даже GDB говорит мне, что адрес функции, по сути, 0x403025.