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

104

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

gcc -g -o helloworld helloworld.c

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

хазиз
источник
15
Я пришел сюда, потому что использую чужой make-файл, а документация - просто чудовище, с которого можно начать. Хороший вопрос к StackOverflow, чтобы найти простой ответ от Google.
GreenAsJade
Подавляющее количество вопросов по SO «охватывает мою документацию», если вы готовы копнуть достаточно глубоко. Это не веская причина для отклонения вопроса.
BeeOnRope 03

Ответы:

105

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

-грамм

Создавайте отладочную информацию в собственном формате операционной системы (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.

МБыД
источник
8
Можно еще объяснить, в чем разница, например, между «наиболее выразительным форматом» и «дополнительной информацией»? Эти параметры дополняют друг друга? Многие из них упоминают GDB ... Спасибо!
rogerdpack
28

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

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

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

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

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

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

U007D
источник