Отладка сгенерированного парсером кода
Я сгенерировал код анализатора с помощью Lemon Parser. Я не могу отладить сгенерированный код. Элемент управления показывает некоторый другой исходный код, нежели текущий выполняемый оператор. Точки останова смещены. Я пробовал на GDB и Visual C++. У обоих одна и та же проблема. Пожалуйста, скажите мне способ отладки.
3 ответа
Допустим, ваш входной файл называется mylexer.y, и в этом случае Lemon сгенерирует myparser.c и myparser.h.
Внутри myparser.c вы увидите такие строки
#line 1 "myparser.y"
Это линейные директивы. Они хороши для отслеживания синтаксических ошибок обратно в файл, который использовался для генерации кода. Они не хороши для отладки.
Чтобы подавить их, вызовите Lemon с опцией -l.
lemon -l myparser.y
Чтобы увидеть другие варианты, не упомянутые в документации, используйте -?
lemon -?
Следующее является сертифицированным WAG (Wild Ass Guess):
Я бы рекомендовал просмотреть все макросы, используемые генератором парсера, и посмотреть, есть ли в них экранированные символы новой строки. Если есть, попробуйте удалить их все (соединив строки вместе), а затем перекомпилируйте файл. Затем посмотрел на код в отладчике - вещи могут внезапно вернуться туда, где они должны быть.
Предыстория: еще в 80-х я разработал и продал отладчик CDB. По мере того, как я переносил его на все, что имело имя U*NX, я хорошо знаком с особенностями различных компиляторов и тем, как они генерировали отладочную информацию в определенных ситуациях.
Одна широко распространенная проблема была связана с макросами, которые ускользали от них. Например
#define foo(bar) bar + \
snort + something_else
x = foo(5);
y = 2;
Если номер строки для y = 2;
должно было быть 5, многие таблицы символов в конечном итоге отображали бы его как 6, и каждая строка после него была бы смещена на единицу. И каждое использование такого макроса будет приводить к удалению номеров строк все дальше и дальше.
Проверьте оптимизацию, параметры отладочной информации, если вы создаете их как lib/dll.