Подтвердить что ты не робот

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

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

gcc -g -o helloworld helloworld.c

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

4b9b3361

Ответ 1

Из docs:

-g

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

Ответ 2

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

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

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

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

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

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