GCC -g vs -g3 Флаг GDB: В чем разница?

При компиляции исходного кода C с помощью gcc или Clang я всегда использую флаг -g для генерации информации для отладки для gdb.

gcc -g -o helloworld helloworld.c

Я заметил, что некоторые люди рекомендуют -g3 . В чем разница между флагами -g и -g3 ? Также существует разница между -g и -ggdb ?

Из документов :

Производить отладочную информацию в собственном формате операционной системы (stabs, COFF, XCOFF или DWARF 2). GDB может работать с этой отладочной информацией. В большинстве систем, использующих формат stabs, -g позволяет использовать дополнительную информацию для отладки, которую может использовать только GDB; эта дополнительная информация улучшает работу отладки в GDB, но, вероятно, приводит к сбою других отладчиков или отказу от чтения программы. Если вы хотите контролировать, нужно ли генерировать дополнительную информацию, используйте -gstabs +, -gstabs, -gxcoff +, -gxcoff или -gvms (см. Ниже).


-ggdb

Производить отладочную информацию для использования GDB. Это означает использование наиболее выразительного формата (DWARF 2, stabs или собственный формат, если ни один из них не поддерживается), включая расширения GDB, если это вообще возможно.


-gvmslevel

Запросите информацию об отладке, а также используйте уровень, чтобы указать, сколько информации. Уровень по умолчанию – 2. Уровень 0 не выводит отладочную информацию вообще. Таким образом, -g0 отрицает -g.

….

Уровень 3 включает дополнительную информацию, такую ​​как все макроопределения, присутствующие в программе. Некоторые отладчики поддерживают расширение макросов при использовании -g3.

tl; dr: Чтобы ответить на ваш конкретный вопрос, -g3 “включает дополнительную информацию, такую ​​как определения макросов. Некоторые отладчики поддерживают расширение макросов при использовании -g3 “, в то время как -g не включает эту дополнительную информацию.

Более широкий ответ заключается в том, что gcc поддерживает четыре уровня отладочной информации, от -g0 (отладочная информация отключена) через -g3 (максимальная информация отладки).

Указание -g эквивалентно -g2 . Любопытно, что gcc docs мало говорят о том, какая информация -g / -g2 включает или исключает:

Запросите информацию об отладке, а также используйте уровень, чтобы указать, сколько информации. Уровень по умолчанию – 2. Уровень 0 не выводит отладочную информацию вообще. Таким образом, -g0 отрицает -g.

Уровень 1 дает минимальную информацию, достаточную для выполнения обратных трассировок в некоторых частях программы, которые вы не планируете отлаживать. Сюда входят описания функций и внешних переменных, а также таблицы номеров строк, но нет информации о локальных переменных.

Уровень 3 включает дополнительную информацию, такую ​​как все макроопределения, присутствующие в программе. Некоторые отладчики поддерживают расширение макросов при использовании -g3.