tl; dr: Чтобы ответить на ваш конкретный вопрос, -g3«включает дополнительную информацию, такую как определения макросов ... Некоторые отладчики поддерживают расширение макросов, когда вы используете -g3», а -gне включает эту дополнительную информацию.
Более широкий ответ заключается в том, что gcc поддерживает четыре уровня отладочной информации, от -g0(отладочная информация отключена) до -g3(максимальная отладочная информация).
Указание -gэквивалентно -g2. Любопытно, что в документации gcc мало говорится о том, какая информация -g/ -g2включает или исключает:
Запросите информацию об отладке, а также используйте уровень, чтобы указать, сколько информации. Уровень по умолчанию - 2. Уровень 0 не дает никакой отладочной информации. Таким образом, -g0 отрицает -g.
Уровень 1 предоставляет минимальный объем информации, достаточный для отслеживания тех частей программы, которые вы не планируете отлаживать. Сюда входят описания функций и внешних переменных, а также таблицы номеров строк, но нет информации о локальных переменных.
Уровень 3 включает дополнительную информацию, такую как все определения макросов, присутствующие в программе. Некоторые отладчики поддерживают расширение макроса при использовании -g3.