Spec-Zone.ru › GCC 4

3.9 Варианты отладки вашей программы или GCC

GCC имеет различные специальные опции, используемые для отладки вашей программы или самого GCC:

-g
Создаёт информацию для отладки в формате, родном для операционной системы (stabs, COFF, XCOFF или DWARF 2). GDB может работать с этой информацией для отладки.

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

GCC позволяет использовать -g с -O. Сокращения, используемые оптимизированным кодом, иногда могут привести к неожиданным результатам: некоторые объявленные вами переменные могут вообще не существовать; поток управления может временно переместиться в непредвиденное место; некоторые операторы могут не выполняться, потому что они вычисляют постоянные результаты или их значения уже известны; некоторые операторы могут выполняться в разных местах, потому что они были перемещены из циклов.

Тем не менее, отладка оптимизированного кода возможна. Это делает разумным использование оптимизатора для программ, которые могут содержать ошибки.

Следующие параметры полезны, когда GCC сгенерирован с возможностью поддержки нескольких форматов отладки.

-gsplit-dwarf
Разделяет максимально возможную информацию для отладки в формате dwarf в отдельный файл с расширением .dwo. Это позволяет системе сборки избежать линковки файлов с информацией для отладки. Для использования этого параметра требуется отладчик, способный читать файлы с расширением .dwo.
-ggdb
Создаёт информацию для отладки, предназначенную для использования GDB. Это означает использование наиболее выразительного доступного формата (DWARF 2, stabs или родной формат, если ни один из них не поддерживается), включая расширения GDB, если это возможно.
-gpubnames
Генерирует разделы dwarf .debug_pubnames и .debug_pubtypes.
-ggnu-pubnames
Генерирует разделы .debug_pubnames и .debug_pubtypes в формате, подходящем для преобразования в индекс GDB. Этот параметр полезен только с линковщиком, который может создавать индекс GDB версии 7.
-gstabs
Создаёт информацию для отладки в формате stabs (если он поддерживается), без расширений GDB. Это формат, используемый DBX на большинстве систем BSD. На системах MIPS, Alpha и System V Release 4 этот параметр генерирует информацию для отладки в формате stabs, которая не понимается DBX или SDB. На системах System V Release 4 этот параметр требует GNU ассемблер.
-feliminate-unused-debug-symbols
Создаёт информацию для отладки в формате stabs (если он поддерживается) только для символов, которые фактически используются.
-femit-class-debug-always
Вместо вывода информации для отладки C++ класса только в одном объектном файле, выводить её во всех объектных файлах, использующих этот класс. Этот параметр следует использовать только с отладчиками, которые не могут обрабатывать способ, которым GCC обычно генерирует информацию для отладки классов, поскольку использование этого параметра увеличивает размер информации для отладки в два раза.
-fdebug-types-section
При использовании DWARF версии 4 или выше, DIE типов можно поместить в свой собственный .debug_types раздел вместо того, чтобы делать их частью .debug_info раздела. Более эффективно помещать их в отдельные разделы comdat, поскольку линковщик затем может удалить дубликаты. Но не все потребители DWARF пока поддерживают .debug_types разделы, и на некоторых объектах .debug_types может производить информацию для отладки большего, а не меньшего размера.
-gstabs+
Создаёт информацию для отладки в формате stabs (если он поддерживается), используя расширения GNU, понятные только отладчику GNU (GDB). Использование этих расширений может привести к сбою или отказу других отладчиков при чтении программы.
-gcoff
Создаёт информацию для отладки в формате COFF (если он поддерживается). Это формат, используемый отладчиком SDB на большинстве систем System V до System V Release 4.
-gxcoff
Создаёт информацию для отладки в формате XCOFF (если он поддерживается). Это формат, используемый отладчиком DBX на системах IBM RS/6000.
-gxcoff+
Создаёт информацию для отладки в формате XCOFF (если он поддерживается), используя расширения GNU, понятные только отладчику GNU (GDB). Использование этих расширений может привести к сбою или отказу других отладчиков при чтении программы, и может привести к ошибке ассемблеров, отличных от GNU ассемблера (GAS).
-gdwarf-version
Создаёт информацию для отладки в формате DWARF (если он поддерживается). Значение version может быть 2, 3 или 4; по умолчанию для большинства целей используется версия 4.

Обратите внимание, что с DWARF версии 2 некоторые порты требуют и всегда используют некоторые неконфликтные расширения DWARF 3 в таблицах разворачивания.

Версия 4 может потребовать GDB 7.0 и -fvar-tracking-assignments для максимальной пользы.

-grecord-gcc-switches
Этот переключатель добавляет опции командной строки, используемые для вызова компилятора, которые могут повлиять на генерацию кода, к атрибуту DW_AT_producer в информации для отладки DWARF. Опции конкатенируются пробелами, разделяющими их друг от друга и от версии компилятора. См. также -frecord-gcc-switches для другого способа хранения опций компилятора в объектный файл. Это значение по умолчанию.
-gno-record-gcc-switches
Запрещает добавление опций командной строки к атрибуту DW_AT_producer в информации для отладки DWARF.
-gstrict-dwarf
Запрещает использование расширений более поздней версии стандарта DWARF, чем выбрано с -gdwarf-version. На большинстве целей разрешено использование неконфликтных расширений DWARF из более поздних версий стандарта.
-gno-strict-dwarf
Разрешает использование расширений более поздней версии стандарта DWARF, чем выбрано с -gdwarf-version.
-gvms
Создаёт информацию для отладки в формате отладки Alpha/VMS (если он поддерживается). Это формат, используемый отладчиком DEBUG на системах Alpha/VMS.
-glevel
-ggdblevel
-gstabslevel
-gcofflevel
-gxcofflevel
-gvmslevel
Запрашивает информацию для отладки и использует level для указания количества информации. Уровень по умолчанию — 2.

Уровень 0 не создаёт никакой информации для отладки. Таким образом, -g0 отрицает -g.

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

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

-gdwarf-2 не принимает конкатенированный уровень отладки, потому что GCC раньше поддерживал опцию -gdwarf, которая означала генерацию информации для отладки в версии 1 формата DWARF (что сильно отличается от версии 2), и это было бы слишком запутанно. Этот формат отладки давно устарел, но опцию нельзя изменить сейчас. Вместо этого используйте дополнительную опцию -glevel для изменения уровня отладки DWARF.

-gtoggle
Отключает генерацию информации для отладки, если её включение происходит по умолчанию, или включает её на уровне 2 в противном случае. Позиция этого аргумента в командной строке не имеет значения; он действует после обработки всех других опций, и делает это только один раз, независимо от того, сколько раз он задан. Это в основном предназначено для использования с -fcompare-debug.
-fsanitize=address
Включает AddressSanitizer, быстрый детектор ошибок памяти. Инструкции доступа к памяти будут оснащены инструментированием для обнаружения ошибок выхода за пределы границ и использования после освобождения. См. https://github.com/google/sanitizers/wiki/AddressSanitizer для получения дополнительной информации. Поведение во время выполнения можно настраивать, используя переменную среды ASAN_OPTIONS. Если она установлена в help=1, доступные опции отображаются при запуске программы с инструментированием. См. https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags для списка поддерживаемых опций.
-fsanitize=kernel-address
Включает AddressSanitizer для ядра Linux. См. https://github.com/google/sanitizers/wiki#threadsanitizer для получения дополнительной информации.
-fsanitize=thread
Включает ThreadSanitizer, быстрый детектор гонок данных. Инструкции доступа к памяти будут оснащены инструментированием для обнаружения ошибок гонки данных. См. https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags для получения дополнительной информации. Поведение во время выполнения можно настраивать, используя переменную среды TSAN_OPTIONS; см. https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags для списка поддерживаемых опций.
-fsanitize=leak
Включает LeakSanitizer, детектор утечек памяти. Этот параметр имеет значение только для линковки исполняемых файлов и если ни -fsanitize=address ни -fsanitize=thread не используются. В этом случае он слинкует исполняемый файл с библиотекой, которая переопределяет malloc и другие функции аллокатора. См. https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer для получения дополнительной информации. Поведение во время выполнения можно настраивать, используя переменную среды LSAN_OPTIONS.
-fsanitize=undefined
Включить UndefinedBehaviorSanitizer, быстрый детектор неопределённых поведений. Различные вычисления будут оснащены средствами отслеживания неопределённого поведения во время выполнения. Текущие подварианты:
-fsanitize=shift
Этот параметр включает проверку того, что результат операции сдвига не является неопределённым. Обратите внимание, что то, что именно считается неопределённым, немного отличается между C и C++, а также между ISO C90 и C99 и т. д.
-fsanitize=integer-divide-by-zero
Обнаруживать целочисленное деление на ноль, а также INT_MIN / -1 деление.
-fsanitize=unreachable
С этим параметром компилятор преобразует вызов __builtin_unreachable в вызов сообщения об ошибке вместо него. При достижении вызова __builtin_unreachable поведение является неопределённым.
-fsanitize=vla-bound
Этот параметр предписывает компилятору проверить, что размер массива переменной длины положителен. Этот параметр не имеет никакого эффекта в режиме -std=c++1y, поскольку стандарт требует, чтобы вместо этого была выброшена исключительная ситуация.
-fsanitize=null
Этот параметр включает проверку указателей. В частности, приложение, скомпилированное с этим параметром, будет выдавать сообщение об ошибке, когда попытается обратиться по указателю NULL или если ссылка (возможно, ссылка на rvalue) привязана к указателю NULL.
-fsanitize=return
Этот параметр включает проверку операторов return. Программы, скомпилированные с этим параметром, будут выдавать сообщение об ошибке, когда достигается конец функции, не возвращающей значение void, без фактического возврата значения. Этот параметр работает только в C++.
-fsanitize=signed-integer-overflow
Этот параметр включает проверку переполнения знакового целого. Мы проверяем, что результат +, *, а также унарных и бинарных - не приводит к переполнению в знаковом арифметическом представлении. Обратите внимание, что должны учитываться правила продвижения целых чисел. То есть, следующее не является переполнением:
signed char a = SCHAR_MAX;
a++;

Хотя -ftrapv вызывает генерацию ловушек для знаковых переполнений, -fsanitize=undefined выдаёт сообщение об ошибке. В настоящее время это работает только для языков семейства C.

-fdump-final-insns[=file]
Вывести окончательную внутреннюю репрезентацию (RTL) в file. Если необязательный аргумент опущен (или если file — .), имя файла дампа определяется добавлением .gkd к имени файла выходного файла компиляции.
-fcompare-debug[=opts]
Если во время компиляции ошибок не произошло, выполните компилятор ещё раз, добавив opts и -fcompare-debug-second в аргументы, передаваемые второй компиляции. Выведите окончательную внутреннюю репрезентацию в обеих компиляциях и выведите сообщение об ошибке, если они отличаются.

Если знак равенства опущен, используется значение по умолчанию -gtoggle.

Переменная окружения GCC_COMPARE_DEBUG, если она определена, непуста и отлична от нуля, неявно включает -fcompare-debug. Если GCC_COMPARE_DEBUG определена как строка, начинающаяся с тире, она используется для opts, в противном случае используется значение по умолчанию -gtoggle.

-fcompare-debug=, со знаком равенства, но без opts, эквивалентно -fno-compare-debug, что отключает вывод окончательной репрезентации и вторую компиляцию, предотвращая даже GCC_COMPARE_DEBUG от вступления в силу.

Для проверки полного охвата во время тестирования -fcompare-debug установите GCC_COMPARE_DEBUG в значение ‘-fcompare-debug-not-overridden’, которое GCC отклонит как недопустимый параметр в любой реальной компиляции (а не в предварительной обработке, сборке или компоновке). Чтобы получить просто предупреждение, установление GCC_COMPARE_DEBUG в ‘-w%n-fcompare-debug not overridden’ поможет.

-fcompare-debug-second
Этот параметр неявно передаётся компилятору для второй компиляции, запрошенной -fcompare-debug, вместе с параметрами для подавления предупреждений и опуская другие параметры, которые вызовут побочные эффекты, связанные с выводом компилятора в файлы или в стандартный вывод. Имена файлов дампов и сохранённых временных файлов будут переименованы таким образом, чтобы они содержали дополнительное расширение .gk во время второй компиляции, чтобы избежать перезаписи файлов, созданных первой.

Когда этот параметр передаётся драйверу компилятора, первая компиляция пропускается, что делает его полезным в основном для отладки самого компилятора.

-feliminate-dwarf2-dups
Сжать отладочную информацию DWARF 2, устраняя дублированную информацию о каждом символе. Этот параметр имеет смысл только при генерации отладочной информации DWARF 2 с -gdwarf-2.
-femit-struct-debug-baseonly
Выводить отладочную информацию для типов, похожих на структуры, только когда базовое имя файла исходного кода соответствует базовому имени файла, в котором определена структура.

Этот параметр значительно уменьшает размер отладочной информации, но с существенной потенциальной потерей информации о типе для отладчика. См. -femit-struct-debug-reduced для менее агрессивного варианта. См. -femit-struct-debug-detailed для более подробного управления.

Этот параметр работает только с DWARF 2.

-femit-struct-debug-reduced
Выводить отладочную информацию для типов, похожих на структуры, только когда базовое имя файла исходного кода соответствует базовому имени файла, в котором тип определён, если структура не является шаблоном или не определена в системном заголовочном файле.

Этот параметр значительно уменьшает размер отладочной информации, с некоторой потенциальной потерей информации о типе для отладчика. См. -femit-struct-debug-baseonly для более агрессивного варианта. См. -femit-struct-debug-detailed для более подробного управления.

Этот параметр работает только с DWARF 2.

-femit-struct-debug-detailed[=spec-list]
Укажите типы структур для которых компилятор генерирует отладочную информацию. Цель состоит в уменьшении дублирования отладочной информации о структурах между различными объектами в рамках одной программы.

Этот параметр — детальный вариант -femit-struct-debug-reduced и -femit-struct-debug-baseonly, который пригоден для большинства случаев.

Спецификация имеет синтаксис [‘dir:’|‘ind:’][‘ord:’|‘gen:’](‘any’|‘sys’|‘base’|‘none’)

Необязательное первое слово ограничивает спецификацию структурами, которые используются напрямую (‘dir:’) или косвенно (‘ind:’). Тип структуры используется напрямую, когда он является типом переменной, члена. Косвенные использования возникают через указатели на структуры. То есть, когда использование неполной структуры допустимо, использование является косвенным. Пример: ‘struct one direct; struct two * indirect;’.

Необязательное второе слово ограничивает спецификацию обычными структурами (‘ord:’) или обобщёнными структурами (‘gen:’). Обобщённые структуры немного сложнее объяснить. Для C++, это неявные специализации шаблонных классов или нешаблонные классы внутри вышеперечисленных. В других языках программирования есть обобщения, но -femit-struct-debug-detailed ещё не реализует их.

Третье слово указывает файлы исходного кода для тех структур, для которых компилятор должен выводить отладочную информацию. Значения ‘none’ и ‘any’ имеют обычное значение. Значение ‘base’ означает, что основа имени файла, в котором появляется объявление типа, должна соответствовать основе имени основного файла компиляции. На практике это означает, что при компиляции foo.c, отладочная информация генерируется для типов, объявленных в этом файле и foo.h, но не для других заголовочных файлов. Значение ‘sys’ означает те типы, удовлетворяющие ‘base’, или объявленные в системных или компиляторных заголовочных файлах.

Возможно, вам придётся поэкспериментировать, чтобы определить лучшие настройки для вашего приложения.

Значение по умолчанию — -femit-struct-debug-detailed=all.

Этот параметр работает только с DWARF 2.

-fno-merge-debug-strings
Указать компоновщику не объединять строки в отладочной информации, которые идентичны в разных объектных файлах. Объединение не поддерживается всеми сборщиками или компоновщиками. Объединение уменьшает размер отладочной информации в выходном файле за счёт увеличения времени обработки компоновки. Объединение включено по умолчанию.
-fdebug-prefix-map=old=new
При компиляции файлов в каталоге old записывать отладочную информацию, описывающую их, как если бы они были в new вместо этого.
-fno-dwarf2-cfi-asm
Вывести информацию DWARF 2 об обработке исключений в виде сгенерированного компилятором .eh_frame раздела, а не использовать GAS .cfi_* директивы.
-p
Генерировать дополнительный код для записи профильной информации, подходящей для программы анализа prof. Вы должны использовать этот параметр при компиляции файлов исходного кода, о которых вы хотите получить данные, а также при компоновке.
-pg
Генерировать дополнительный код для записи профильной информации, подходящей для программы анализа gprof. Вы должны использовать этот параметр при компиляции файлов исходного кода, о которых вы хотите получить данные, а также при компоновке.
-Q
Заставляет компилятор выводить имя каждой функции при её компиляции и выводить статистику о каждом проходе при его завершении.
-ftime-report
Заставляет компилятор выводить статистику о времени, затраченном каждым проходом при его завершении.
-fmem-report
Заставляет компилятор выводить статистику об операциях выделения постоянной памяти при его завершении.
-fmem-report-wpa
Заставляет компилятор выводить статистику об операциях выделения постоянной памяти только для фазы WPA.
-fpre-ipa-mem-report
-fpost-ipa-mem-report
Заставляет компилятор выводить статистику об операциях выделения постоянной памяти до или после межпроцедурной оптимизации.
-fprofile-report
Заставляет компилятор выводить статистику о согласованности (оценённого) профиля и влиянии отдельных проходов.
-fstack-usage
Создаёт в выводе компилятора информацию об использовании стека программой, по функциям. Имя файла для дампа формируется путём добавления .su к auxname. auxname генерируется из имени выходного файла, если он явно указан и это не исполняемый файл, иначе это имя файла исходного кода без расширения. Запись состоит из трёх полей:
  • Имя функции.
  • Число байтов.
  • Один или несколько квалификаторов: static, dynamic, bounded.

Квалификатор static означает, что функция манипулирует стеком статически: фиксированное количество байтов выделяется для кадра при входе в функцию и освобождается при выходе из функции; никаких других корректировок стека в функции не выполняется. Второе поле содержит это фиксированное количество байтов.

Квалификатор dynamic означает, что функция динамически манипулирует стеком: помимо статического выделения, описанного выше, в теле функции выполняются корректировки стека, например, для помещения/извлечения аргументов вокруг вызовов функций. Если также присутствует квалификатор bounded, количество таких корректировок ограничено во время компиляции, и второе поле является верхней границей общего объёма используемой функцией памяти стека. Если он отсутствует, то количество таких корректировок не ограничено во время компиляции, и второе поле представляет только ограниченную часть.

-fprofile-arcs
Добавляет код для инструментирования дуг потока программы. Во время выполнения программа записывает, сколько раз выполняется каждый разветвление и вызов, и сколько раз он выполняется или возвращает значение. После завершения компилированной программы она сохраняет эти данные в файл, названный auxname.gcda для каждого файла исходного кода. Данные могут быть использованы для оптимизаций, направленных на профилирование (-fbranch-probabilities), или для анализа покрытия тестами (-ftest-coverage). auxname для каждого объектного файла генерируется из имени выходного файла, если он явно указан и это не окончательный исполняемый файл, иначе это имя файла исходного кода без расширения. В обоих случаях удаляется любой суффикс (например, foo.gcda для входного файла dir/foo.c, или dir/foo.gcda для указанного выходного файла -o dir/foo.o). См. Перекрёстное профилирование.
--coverage
Этот параметр используется для компиляции и компоновки кода, инструментированного для анализа покрытия. Параметр является синонимом для -fprofile-arcs -ftest-coverage (при компиляции) и -lgcov (при компоновке). См. документацию по этим параметрам для получения более подробной информации.
  • Компилируйте файлы исходного кода с помощью -fprofile-arcs плюс параметры оптимизации и генерации кода. Для анализа покрытия тестами используйте дополнительный параметр -ftest-coverage. Вам не нужно профилировать каждый файл исходного кода в программе.
  • Компонуйте ваши объектные файлы с помощью -lgcov или -fprofile-arcs (последний подразумевает первый).
  • Запустите программу на представительной рабочей нагрузке, чтобы сгенерировать информацию о профилировании дуг. Это можно повторять любое количество раз. Вы можете запускать параллельные экземпляры вашей программы, и при условии, что файловая система поддерживает блокировку, данные файлы будут правильно обновлены. Также вызовы fork обнаруживаются и обрабатываются правильно (двойного учёта не произойдёт).
  • Для оптимизаций, направленных на профилирование, снова скомпилируйте файлы исходного кода с теми же параметрами оптимизации и генерации кода плюс -fbranch-probabilities (см. Параметры управления оптимизацией).
  • Для анализа покрытия тестами используйте gcov для получения удобочитаемой информации из файлов .gcno и .gcda. Для получения дополнительной информации обратитесь к документации по gcov.

С помощью -fprofile-arcs, для каждой функции вашей программы GCC создаёт граф потока программы, а затем находит остовное дерево для графа. Только дуги, которые не находятся в остовном дереве, должны быть инструментированы: компилятор добавляет код для подсчёта количества раз, когда эти дуги выполняются. Когда дуга является единственным выходом или единственным входом в блок, код инструментирования может быть добавлен в блок; в противном случае должен быть создан новый базовый блок для размещения кода инструментирования.

-ftest-coverage
Создаёт файл заметок, который может использовать утилита анализа покрытия кода gcov (см. gcov — программа анализа покрытия тестами), чтобы показать покрытие программы. Файл заметок для каждого файла исходного кода называется auxname.gcno. Обратитесь к параметру -fprofile-arcs выше для описания auxname и инструкций по генерации данных для анализа покрытия тестами. Данные покрытия соответствуют файлам исходного кода более точно, если вы не используете оптимизацию.
-fdbg-cnt-list
Выводит имя и верхнюю границу счётчика для всех счётчиков отладки.
-fdbg-cnt=counter-value-list
Устанавливает внутреннюю верхнюю границу счётчика отладки. counter-value-list — это список, разделённый запятыми, пар name:value, который устанавливает верхнюю границу каждого счётчика отладки name на значение value. Все счётчики отладки имеют начальную верхнюю границу UINT_MAX; таким образом, dbg_cnt() всегда возвращает true, если верхняя граница не установлена этим параметром. Например, с параметром -fdbg-cnt=dce:10,tail_call:0, dbg_cnt(dce) возвращает true только для первых 10 вызовов.
-fenable-kind-pass
-fdisable-kind-pass=range-list
Это набор параметров, используемых для явного отключения/включения оптимизационных проходов. Эти параметры предназначены для использования в отладке GCC. Пользователи компилятора должны использовать обычные параметры для включения/отключения проходов вместо этого.
-fdisable-ipa-pass
Отключает проход IPA pass. pass — имя прохода. Если тот же проход статически вызывается в компиляторе несколько раз, имя прохода должно быть дополнено последовательным номером, начиная с 1.
-fdisable-rtl-pass
-fdisable-rtl-pass=range-list
Отключает проход RTL pass. pass — имя прохода. Если тот же проход статически вызывается в компиляторе несколько раз, имя прохода должно быть дополнено последовательным номером, начиная с 1. range-list — это список, разделённый запятыми, диапазонов функций или имен ассемблера. Каждый диапазон — это пара чисел, разделённых двоеточием. Диапазон включительно. Если диапазон тривиален, пару чисел можно упростить до одного числа. Если узел узла графа вызовов функций uid попадает в один из указанных диапазонов, проход pass отключается для этой функции. uid отображается в заголовке функции файла дампа, а имена проходов можно вывести, используя параметр -fdump-passes.
-fdisable-tree-pass
-fdisable-tree-pass=range-list
Отключает проход дерева pass. См. -fdisable-rtl для описания аргументов параметров.
-fenable-ipa-pass
Включает проход IPA pass. pass — имя прохода. Если тот же проход статически вызывается в компиляторе несколько раз, имя прохода должно быть дополнено последовательным номером, начиная с 1.
-fenable-rtl-pass
-fenable-rtl-pass=range-list
Включает проход RTL pass. См. -fdisable-rtl для описания аргументов параметров и примеров.
-fenable-tree-pass
-fenable-tree-pass=range-list
Включает проход дерева pass. См. -fdisable-rtl для описания аргументов параметров.

Вот несколько примеров использования этих параметров.

# disable ccp1 for all functions
   -fdisable-tree-ccp1
# disable complete unroll for function whose cgraph node uid is 1
   -fenable-tree-cunroll=1
# disable gcse2 for functions at the following ranges [1,1],
# [300,400], and [400,1000]
# disable gcse2 for functions foo and foo2
   -fdisable-rtl-gcse2=foo,foo2
# disable early inlining
   -fdisable-tree-einline
# disable ipa inlining
   -fdisable-ipa-inline
# enable tree full unroll
   -fenable-tree-unroll
-dletters
-fdump-rtl-pass
-fdump-rtl-pass=filename
Указывает на создание дампов отладки во время компиляции в моменты, указанные символами letters. Это используется для отладки проходов компилятора, основанных на RTL. Имена файлов для большинства дампов создаются путем добавления номера прохода и слова к dumpname, а файлы создаются в каталоге выходного файла. В случае опции =filename, дамп выводится в указанный файл вместо файлов с номером прохода. Обратите внимание, что номер прохода вычисляется статически по мере регистрации проходов в менеджере проходов. Таким образом, нумерация не связана с динамическим порядком выполнения проходов. В частности, проход, установленный плагином, может иметь номер больше 200, даже если он выполняется довольно рано. dumpname генерируется из имени выходного файла, если он явно указан и не является исполняемым файлом, иначе это имя файла исходного файла без пути. Эти переключатели могут иметь разные эффекты при использовании -E для предварительной обработки.

Дампы отладки можно включить с помощью переключателя -fdump-rtl или опции -d letters. Вот возможные символы для использования в pass и letters, и их значения:

-fdump-rtl-alignments
Дамп после вычисления выравниваний ветвей.
-fdump-rtl-asmcons
Дамп после исправления инструкций RTL, у которых не удовлетворены ограничения в/из.
-fdump-rtl-auto_inc_dec
Дамп после обнаружения автоинкремента/декремента. Этот проход выполняется только на архитектурах, имеющих инструкции автоинкремента или автодекремента.
-fdump-rtl-barriers
Дамп после очистки инструкций барьеров.
-fdump-rtl-bbpart
Дамп после разделения горячих и холодных базовых блоков.
-fdump-rtl-bbro
Дамп после переупорядочивания блоков.
-fdump-rtl-btl1
-fdump-rtl-btl2
-fdump-rtl-btl1 и -fdump-rtl-btl2 включают дамп после двух проходов оптимизации загрузки целевых адресов ветвей.
-fdump-rtl-bypass
Дамп после оптимизации обхода переходов и потока управления.
-fdump-rtl-combine
Дамп после прохода объединения инструкций RTL.
-fdump-rtl-compgotos
Дамп после дублирования вычисленных переходов.
-fdump-rtl-ce1
-fdump-rtl-ce2
-fdump-rtl-ce3
-fdump-rtl-ce1, -fdump-rtl-ce2, и -fdump-rtl-ce3 включают дамп после трёх проходов преобразования инструкций if.
-fdump-rtl-cprop_hardreg
Дамп после распространения копирования регистров с жёстким назначением.
-fdump-rtl-csa
Дамп после объединения корректировок стека.
-fdump-rtl-cse1
-fdump-rtl-cse2
-fdump-rtl-cse1 и -fdump-rtl-cse2 включают дамп после двух проходов устранения общих подвыражений.
-fdump-rtl-dce
Дамп после независимых проходов устранения мёртвого кода.
-fdump-rtl-dbr
Дамп после планирования отложенных ветвлений.
-fdump-rtl-dce1
-fdump-rtl-dce2
-fdump-rtl-dce1 и -fdump-rtl-dce2 включают дамп после двух проходов устранения мёртвых сохранений.
-fdump-rtl-eh
Дамп после завершения обработки EH.
-fdump-rtl-eh_ranges
Дамп после преобразования областей обработки EH.
-fdump-rtl-expand
Дамп после генерации RTL.
-fdump-rtl-fwprop1
-fdump-rtl-fwprop2
-fdump-rtl-fwprop1 и -fdump-rtl-fwprop2 включают дамп после двух проходов распространения вперёд.
-fdump-rtl-gcse1
-fdump-rtl-gcse2
-fdump-rtl-gcse1 и -fdump-rtl-gcse2 включают дамп после глобального устранения общих подвыражений.
-fdump-rtl-init-regs
Дамп после инициализации регистров.
-fdump-rtl-initvals
Дамп после вычисления наборов начальных значений.
-fdump-rtl-into_cfglayout
Дамп после перехода в режим cfglayout.
-fdump-rtl-ira
Дамп после итеративного распределения регистров.
-fdump-rtl-jump
Дамп после второй оптимизации переходов.
-fdump-rtl-loop2
-fdump-rtl-loop2 включает дамп после проходов оптимизации циклов RTL.
-fdump-rtl-mach
Дамп после выполнения прохода машинозависимой реорганизации, если такой проход существует.
-fdump-rtl-mode_sw
Дамп после удаления избыточных переключений режимов.
-fdump-rtl-rnreg
Дамп после пересчёт номера регистров.
-fdump-rtl-outof_cfglayout
Дамп после перехода из режима cfglayout.
-fdump-rtl-peephole2
Дамп после прохода peephole.
-fdump-rtl-postreload
Дамп после оптимизаций после загрузки.
-fdump-rtl-pro_and_epilogue
Дамп после генерации пролога и эпилога функции.
-fdump-rtl-sched1
-fdump-rtl-sched2
-fdump-rtl-sched1 и -fdump-rtl-sched2 включают дамп после проходов планирования базовых блоков.
-fdump-rtl-ree
Дамп после устранения расширения/сжатия знака.
-fdump-rtl-seqabstr
Дамп после обнаружения общих последовательностей.
-fdump-rtl-shorten
Дамп после укорочения ветвей.
-fdump-rtl-sibling
Дамп после оптимизаций вызовов между соседними функциями.
-fdump-rtl-split1
-fdump-rtl-split2
-fdump-rtl-split3
-fdump-rtl-split4
-fdump-rtl-split5
-fdump-rtl-split1, -fdump-rtl-split2, -fdump-rtl-split3, -fdump-rtl-split4 и -fdump-rtl-split5 включают дамп после пяти раундов разделения инструкций.
-fdump-rtl-sms
Дамп после модульного планирования. Этот проход выполняется только на некоторых архитектурах.
-fdump-rtl-stack
Дамп после перехода от регистров GCC «плоского файла регистров» к стековым регистрам x87. Этот проход выполняется только на x86-совместимых архитектурах.
-fdump-rtl-subreg1
-fdump-rtl-subreg2
-fdump-rtl-subreg1 и -fdump-rtl-subreg2 включают дамп после двух проходов расширения подрегистров.
-fdump-rtl-unshare
Дамп после того, как все rtl были разделены.
-fdump-rtl-vartrack
Дамп после отслеживания переменных.
-fdump-rtl-vregs
Дамп после преобразования виртуальных регистров в регистры с жёстким назначением.
-fdump-rtl-web
Дамп после разделения диапазонов активности.
-fdump-rtl-regclass
-fdump-rtl-subregs_of_mode_init
-fdump-rtl-subregs_of_mode_finish
-fdump-rtl-dfinit
-fdump-rtl-dfinish
Эти дампы определены, но всегда производят пустые файлы.
-da
-fdump-rtl-all
Создать все дампы, перечисленные выше.
-dA
Добавить в выходной код ассемблера различные отладочные данные.
-dD
Вывести все определения макросов в конце предварительной обработки, помимо обычного вывода.
-dH
Создать дамп ядра при возникновении ошибки.
-dp
Добавить в выходной код ассемблера комментарий, указывающий, какой шаблон и альтернатива использовались. Также выводится длина каждой инструкции.
-dP
Вывести RTL в выходном коде ассемблера в виде комментария перед каждой инструкцией. Также включить аннотацию -dp.
-dx
Просто сгенерировать RTL для функции вместо её компиляции. Обычно используется с -fdump-rtl-expand.
-fdump-noaddr
При создании дампов отладки подавить вывод адресов. Это делает более осуществимым использование diff на дампах отладки для вызовов компилятора с различными бинарными файлами компилятора и/или различными начальными расположениями текста/bss/data/кучи/стека/dso.
-fdump-unnumbered
При создании дампов отладки подавить вывод номеров инструкций и адресов. Это делает более осуществимым использование diff на дампах отладки для вызовов компилятора с различными опциями, в частности с и без -g.
-fdump-unnumbered-links
При создании дампов отладки (см. опцию -d выше), подавить вывод номеров инструкций для ссылок на предыдущую и следующую инструкции в последовательности.
-fdump-translation-unit (Только C++)
-fdump-translation-unit-options (Только C++)
Вывести представление древовидной структуры для всего файла трансляции в файл. Имя файла создаётся путём добавления .tu к имени файла исходника, и файл создаётся в том же каталоге, что и выходной файл. Если используется форма ‘-options’, options управляет деталями дампа, как описано для опций -fdump-tree.
-fdump-class-hierarchy (Только C++)
-fdump-class-hierarchy-options (Только C++)
Вывести представление иерархии каждого класса и расположения таблицы виртуальных функций в файл. Имя файла создаётся путем добавления .class к имени файла исходника, и файл создается в том же каталоге, что и выходной файл. Если используется форма ‘-options’, options управляет деталями дампа, как описано для опций -fdump-tree.
-fdump-ipa-switch
Управляйте выгрузкой на различных этапах межпроцедурного анализа дерева языка в файл. Имя файла генерируется путем добавления специфичного для переключателя суффикса к имени исходного файла, и файл создается в той же директории, что и выходной файл. Возможны следующие выгрузки:
‘all’
Включает все выгрузки межпроцедурного анализа.
‘cgraph’
Выгружает информацию об оптимизации графа вызовов, удалении неиспользуемых функций и решениях инлайнинга.
‘inline’
Выгрузка после инлайнинга функций.
-fdump-passes
Выводит список оптимизационных проходов, которые включены или выключены текущими параметрами командной строки.
-fdump-statistics-option
Включает и управляет выгрузкой статистики проходов в отдельный файл. Имя файла формируется путем добавления суффикса, заканчивающегося на ‘.statistics’, к имени исходного файла, и файл создается в той же директории, что и выходной файл. Если используется форма ‘-option’, ‘-stats’ вызывает суммирование счётчиков по всему модулю компиляции, а ‘-details’ выгружает каждое событие по мере их генерации проходами. По умолчанию, без указания опции, суммируются счётчики для каждой компилируемой функции.
-fdump-tree-switch
-fdump-tree-switch-options
-fdump-tree-switch-options=filename
Управление выгрузкой на различных этапах обработки дерева промежуточного языка в файл. Имя файла генерируется путем добавления специфичного для переключателя суффикса к имени исходного файла, и файл создается в той же директории, что и выходной файл. В случае опции =filename, выгрузка выводится в заданный файл вместо автоматически сгенерированных файлов выгрузки. Если используется форма ‘-options’, options — список опций, разделённых ‘-’, которые управляют деталями выгрузки. Не все опции применимы ко всем выгрузкам; те, которые не имеют смысла, игнорируются. Доступны следующие опции
‘address’
Печатает адрес каждого узла. Обычно это не имеет смысла, поскольку он меняется в зависимости от среды и исходного файла. Его основное применение — связывание файла выгрузки с отладочной средой.
‘asmname’
Если для данного объявления была установлена DECL_ASSEMBLER_NAME, используется она в выгрузке вместо DECL_NAME. Основное применение — удобство работы, исходя из ссылок на имена в файлах сборки.
‘slim’
При выгрузке промежуточных представлений переднего плана, запрещает выгрузку членов области видимости или тела функции только потому, что эта область видимости достигнута. Выгружаются только такие элементы, к которым можно напрямую получить доступ через другой путь.

При выгрузке форматированных деревьев, эта опция запрещает выгрузку тел управляющих структур.

При выгрузке RTL, печатает RTL в сжатой форме вместо стандартного представления в стиле LISP.

‘raw’
Печатает сырое представление дерева. По умолчанию деревья выводятся в форматированном виде, подобном C.
‘details’
Включает более подробные выгрузки (не учитывается каждой опцией выгрузки). Также включает информацию из оптимизационных проходов.
‘stats’
Включает выгрузку различных статистических данных о проходе (не учитывается каждой опцией выгрузки).
‘blocks’
Включает отображение границ базовых блоков (отключено в сырых выгрузках).
‘graph’
Для каждого из указанных файлов выгрузки (-fdump-rtl-pass), выгружает представление графа потока управления, подходящее для просмотра с помощью GraphViz, в file.passid.pass.dot. Каждая функция в файле форматируется как подграф, так что GraphViz может отобразить их все на одном графике.

Эта опция в настоящее время работает только для выгрузок RTL, и RTL всегда выгружается в сжатом виде.

‘vops’
Включает отображение виртуальных операндов для каждого оператора.
‘lineno’
Включает отображение номеров строк для операторов.
‘uid’
Включает отображение уникального идентификатора (DECL_UID) для каждой переменной.
‘verbose’
Включает выгрузку дерева для каждого оператора.
‘eh’
Включает отображение номера региона EH, содержащего каждый оператор.
‘scev’
Включает отображение подробностей анализа эволюции скаляров.
‘optimized’
Включает отображение информации об оптимизации (доступно только в некоторых проходах).
‘missed’
Включает отображение пропущенной информации об оптимизации (доступно только в некоторых проходах).
‘notes’
Включает другую подробную информацию об оптимизации (доступно только в определенных проходах).
‘=filename’
Вместо автоматически сгенерированного файла выгрузки, выгружает в указанное имя файла. Файлы с именами stdout и stderr обрабатываются особым образом и считаются открытыми стандартными потоками. Например,
gcc -O2 -ftree-vectorize -fdump-tree-vect-blocks=foo.dump
     -fdump-tree-pre=stderr file.c

выгружает выгрузку векторного процессора в foo.dump, а выгрузка PRE выводится в stderr. Если для одного и того же прохода указано два конфликтующих имени файла выгрузки, то последняя опция перекрывает предыдущую.

‘all’
Включает все опции, кроме raw, slim, verbose и lineno.
‘optall’
Включает все опции оптимизации, т.е. optimized, missed, и note.

Возможны следующие выгрузки деревьев:

‘original’
Выгрузка до любой оптимизации, основанной на дереве, в file.original.
‘optimized’
Выгрузка после всех оптимизаций, основанных на дереве, в file.optimized.
‘gimple’
Выгружает каждую функцию до и после прохода gimplification в файл. Имя файла формируется путем добавления .gimple к имени исходного файла.
‘cfg’
Выгружает граф потока управления каждой функции в файл. Имя файла создаётся путём добавления .cfg к имени исходного файла.
‘ch’
Выгружает каждую функцию после копирования заголовков циклов. Имя файла формируется добавлением .ch к имени исходного файла.
‘ssa’
Выгружает информацию, связанную с SSA, в файл. Имя файла формируется добавлением .ssa к имени исходного файла.
‘alias’
Выгружает информацию об алиасинге для каждой функции. Имя файла создаётся путём добавления .alias к имени исходного файла.
‘ccp’
Выгружает каждую функцию после CCP. Имя файла формируется добавлением .ccp к имени исходного файла.
‘storeccp’
Выгружает каждую функцию после STORE-CCP. Имя файла формируется добавлением .storeccp к имени исходного файла.
‘pre’
Выгружает деревья после частичного удаления избыточности. Имя файла формируется путём добавления .pre к имени исходного файла.
‘fre’
Выгружает деревья после полного удаления избыточности. Имя файла формируется добавлением .fre к имени исходного файла.
‘copyprop’
Выгружает деревья после распространения копий. Имя файла формируется путём добавления .copyprop к имени исходного файла.
‘store_copyprop’
Выгружает деревья после распространения копий сохранений. Имя файла формируется добавлением .store_copyprop к имени исходного файла.
‘dce’
Выгружает каждую функцию после удаления мёртвого кода. Имя файла создаётся путём добавления .dce к имени исходного файла.
‘sra’
Выгружает каждую функцию после замены скаляров агрегатами. Имя файла формируется добавлением .sra к имени исходного файла.
‘sink’
Выгружает каждую функцию после погружения кода. Имя файла формируется добавлением .sink к имени исходного файла.
‘dom’
Выгружает каждую функцию после оптимизаций дерева доминирования. Имя файла формируется добавлением .dom к имени исходного файла.
‘dse’
Выгружает каждую функцию после удаления мёртвых сохранений. Имя файла формируется добавлением .dse к имени исходного файла.
‘phiopt’
Выгружает каждую функцию после оптимизации узлов PHI в линейный код. Имя файла формируется добавлением .phiopt к имени исходного файла.
‘forwprop’
Выгружает каждую функцию после распространения переменных с одним использованием вперёд. Имя файла формируется добавлением .forwprop к имени исходного файла.
‘copyrename’
Выгружает каждую функцию после применения оптимизации переименования копий. Имя файла формируется добавлением .copyrename к имени исходного файла.
‘nrv’
Выгружает каждую функцию после применения оптимизации именованного возвращаемого значения для общих деревьев. Имя файла формируется добавлением .nrv к имени исходного файла.
‘vect’
Выгружает каждую функцию после применения векторизации циклов. Имя файла формируется добавлением .vect к имени исходного файла.
‘slp’
Выгружает каждую функцию после применения векторизации базовых блоков. Имя файла формируется добавлением .slp к имени исходного файла.
‘vrp’
Выгружает каждую функцию после распространения диапазонов значений (VRP). Имя файла формируется добавлением .vrp к имени исходного файла.
‘all’
Включает все доступные выгрузки деревьев с флагами, предоставленными в этой опции.
-fopt-info
-fopt-info-options
-fopt-info-options=filename
Управляет выводом оптимизационных дампов из различных оптимизационных проходов. Если используется форма ‘-options’, options — это список опций, разделённых ‘-’, для выбора деталей дампов и оптимизаций. Если options не указан, он по умолчанию равен optimized для деталей и optall для групп оптимизаций. Если filename не указан, он по умолчанию равен stderr. Обратите внимание, что выходной filename будет перезаписан в случае нескольких единиц перевода. Если требуется объединённый вывод от нескольких единиц перевода, следует использовать stderr вместо этого.

Опции можно разделить на две группы: 1) опции, описывающие подробность вывода, и 2) опции, описывающие, какие оптимизации следует включить. Опции из обеих групп могут быть свободно смешаны, так как они не перекрываются. Однако в случае конфликтов последующие опции переопределяют предыдущие опции в командной строке. Хотя принимаются несколько опций -fopt-info, только одна из них может иметь =filename. Если указаны другие имена файлов, все, кроме первого, игнорируются.

Подробность вывода дампов имеет следующие опции:

‘optimized’
Выводит информацию, когда оптимизация успешно применена. Задача прохода — определить, какая информация актуальна. Например, проходы векторизации выводят расположение исходного кода циклов, которые были успешно векторизованы.
‘missed’
Выводит информацию об упущенных оптимизациях. Индивидуальные проходы управляют тем, какую информацию включать в выходные данные. Например,
gcc -O2 -ftree-vectorize -fopt-info-vec-missed

выведет информацию об упущенных возможностях оптимизации из проходов векторизации в stderr.

‘note’
Выводит подробную информацию об оптимизациях, таких как определённые преобразования, более подробные сообщения о принятых решениях и т. д.
‘all’
Выводит подробную информацию об оптимизациях. Это включает optimized, missed и note.

Вторая группа опций описывает группу оптимизаций и может включать одну или несколько следующих.

‘ipa’
Включает дампы из всех межпроцедурных оптимизаций.
‘loop’
Включает дампы из всех оптимизаций циклов.
‘inline’
Включает дампы из всех оптимизаций встраивания.
‘vec’
Включает дампы из всех оптимизаций векторизации.
‘optall’
Включает дампы из всех оптимизаций. Это надмножество перечисленных выше групп оптимизаций.

Например,

gcc -O3 -fopt-info-missed=missed.all

выводит отчёт об упущенных оптимизациях из всех проходов в missed.all.

Ещё один пример:

gcc -O3 -fopt-info-inline-optimized-missed=inline.txt

выведет информацию об упущенных оптимизациях, а также о местах оптимизации из всех проходов встраивания в inline.txt.

Если filename указан, дампы от всех применимых оптимизаций конкатенируются в filename. В противном случае дамп выводится на stderr. Если options опущен, он по умолчанию равен all-optall, что означает вывод всей доступной информации об оптимизации из всех проходов. В следующем примере вся информация об оптимизации выводится на stderr.

gcc -O3 -fopt-info

Обратите внимание, что -fopt-info-vec-missed ведет себя так же, как -fopt-info-missed-vec.

Ещё один пример:

gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt

Здесь два выходных имени файла vec.miss и loop.opt конфликтуют, так как разрешен только один выходной файл. В этом случае вступает в силу только первая опция, а последующие опции игнорируются. Таким образом, генерируется только vec.miss, содержащий дампы векторизатора об упущенных возможностях.

-frandom-seed=string
Эта опция предоставляет семенное значение, которое GCC использует вместо случайных чисел при генерации определённых имён символов, которые должны быть разными в каждом скомпилированном файле. Она также используется для размещения уникальных меток в файлах данных покрытия и объектных файлах, которые их генерируют. Вы можете использовать опцию -frandom-seed для создания воспроизводимо идентичных объектных файлов.

Значение string должно быть разным для каждого компилируемого файла.

-fsched-verbose=n
На целевых платформах, использующих планирование инструкций, эта опция управляет объёмом отладочной информации, выводимой планировщиком. Эта информация записывается в стандартный вывод ошибки, если не указано -fdump-rtl-sched1 или -fdump-rtl-sched2, в этом случае она выводится в обычный файл дампов, .sched1 или .sched2 соответственно. Однако для n больше девяти вывод всегда печатается в стандартный вывод ошибки.

Для n больше нуля, -fsched-verbose выводит ту же информацию, что и -fdump-rtl-sched1 и -fdump-rtl-sched2. Для n больше единицы также выводится информация о вероятностях базовых блоков, подробные данные о готовых списках и информация о блоках/инструкциях. Для n больше двух она включает RTL в точке прерывания, информацию о потоке управления и регионах. А для n больше четырёх, -fsched-verbose также включает информацию о зависимостях.

-save-temps
-save-temps=cwd
Постоянно сохраняет обычные «временные» промежуточные файлы; помещает их в текущий каталог и называет их в соответствии с исходным файлом. Таким образом, компиляция foo.c с -c -save-temps создаёт файлы foo.i и foo.s, а также foo.o. Это создаёт файл препроцессированного foo.i вывода, хотя компилятор теперь обычно использует встроенный препроцессор.

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

Если вы вызываете GCC параллельно, компилируя несколько разных исходных файлов, которые имеют общее имя файла в разных подкаталогах или один исходный файл, скомпилированный для нескольких мест назначения, высока вероятность, что разные параллельные компиляторы будут мешать друг другу и перезаписывать временные файлы. Например:

gcc -save-temps -o outdir1/foo.o indir1/foo.c&
gcc -save-temps -o outdir2/foo.o indir2/foo.c&

может привести к тому, что foo.i и foo.o будут записаны одновременно обоими компиляторами.

-save-temps=obj
Постоянно сохраняет обычные «временные» промежуточные файлы. Если используется опция -o, временные файлы базируются на объектном файле. Если опция -o не используется, переключатель -save-temps=obj ведет себя как -save-temps.

Например:

gcc -save-temps=obj -c foo.c
gcc -save-temps=obj -c bar.c -o dir/xbar.o
gcc -save-temps=obj foobar.c -o dir2/yfoobar

создаёт foo.i, foo.s, dir/xbar.i, dir/xbar.s, dir2/yfoobar.i, dir2/yfoobar.s, и dir2/yfoobar.o.

-time[=file]
Отчитывается о времени процессора, затраченном каждым подпроцессом в последовательности компиляции. Для исходных файлов C это собственно компилятор и ассемблер (плюс компоновщик, если компоновка выполняется).

Без указания выходного файла вывод выглядит так:

# cc1 0.12 0.01
# as 0.00 0.01

Первое число в каждой строке — «время пользователя», то есть время, затраченное на выполнение самой программы. Второе число — «системное время», время, затраченное на выполнение системных процедур от имени программы. Оба числа указаны в секундах.

При указании выходного файла вывод добавляется к указанному файлу, и он выглядит так:

0.12 0.01 cc1 options
0.00 0.01 as options

«Время пользователя» и «системное время» перемещаются перед именем программы, и отображаются переданные программе опции, чтобы можно было позже определить, какой файл компилировался и с какими опциями.

-fvar-tracking
Запускает проход отслеживания переменных. Он вычисляет, где хранятся переменные в каждой позиции кода. Затем генерируется более подробная отладочная информация (если формат отладочной информации поддерживает эту информацию).

Он включён по умолчанию при компиляции с оптимизацией (-Os, -O, -O2, ...), отладочной информацией (-g) и формат отладочной информации это поддерживает.

-fvar-tracking-assignments
Ранняя аннотация присваиваний переменных пользователям в процессе компиляции и попытка перенести аннотации на протяжении всего процесса компиляции до конца, чтобы улучшить отладочную информацию при оптимизации. Рекомендуется использовать -gdwarf-4 вместе с ним.

Его можно включить даже если отслеживание переменных отключено, в этом случае аннотации создаются и поддерживаются, но отбрасываются в конце.

-fvar-tracking-assignments-toggle
Включает/выключает -fvar-tracking-assignments, так же, как -gtoggle включает/выключает -g.
-print-file-name=library
Выводит полное абсолютное имя файла библиотеки library, которое будет использоваться при компоновке — и ничего более не делает. С этой опцией GCC не компилирует и не компонует ничего; он просто выводит имя файла.
-print-multi-directory
Выводит имя каталога, соответствующего выбранной multilib, присутствующей в командной строке. Этот каталог должен существовать в GCC_EXEC_PREFIX.
-print-multi-lib
Выводит соответствие между именами каталогов multilib и ключами компилятора, которые их активируют. Имя каталога отделено от ключей ‘;’, а каждый ключ начинается с ‘@’ вместо ‘-’, без пробелов между несколькими ключами. Это должно упростить обработку в оболочке.
-print-multi-os-directory
Выводит путь к системным библиотекам для выбранной multilib, относительно некоторого подкаталога lib. Если системные библиотеки находятся в подкаталоге lib и multilibs не используются, это обычно просто ., если системные библиотеки находятся в каталогах-близнецах libsuffix, это печатает, например, ../lib64, ../lib или ../lib32, или если системные библиотеки находятся в подкаталогах lib/subdir, это печатает, например, amd64, sparcv9 или ev6.
-print-multiarch
Выводит путь к системным библиотекам для выбранной multiarch, относительно некоторого подкаталога lib.
-print-prog-name=program
Как -print-file-name, но ищет программу, такую как ‘cpp’.
-print-libgcc-file-name
То же самое, что и -print-file-name=libgcc.a.

Это полезно, когда вы используете -nostdlib или -nodefaultlibs, но хотите связаться с libgcc.a. Вы можете сделать так:

gcc -nostdlib files... `gcc -print-libgcc-file-name`
-print-search-dirs
Выводит имя настроенного каталога установки и список каталогов программ и библиотек, которые gcc ищет — и ничего больше не делает.

Это полезно, когда installation problem, cannot exec cpp0: No such file or directory выводит сообщение об ошибке ‘installation problem, cannot exec cpp0: No such file or directory’. Для решения этой проблемы вам нужно поместить cpp0 и другие компоненты компилятора туда, где gcc ожидает их найти, или вы можете установить переменную окружения GCC_EXEC_PREFIX в каталог, где вы их установили. Не забудьте конечный символ ‘/’. См. Переменные окружения.

-print-sysroot
Выводит целевой каталог sysroot, используемый во время компиляции. Это целевой sysroot, указанный либо во время настройки, либо с помощью опции --sysroot, возможно, с дополнительным суффиксом, зависящим от опций компиляции. Если целевой sysroot не указан, опция ничего не выводит.
-print-sysroot-headers-suffix
Выводит суффикс, добавленный к целевому sysroot при поиске заголовочных файлов, или выводит ошибку, если компилятор не настроен с таким суффиксом — и ничего больше не делает.
-dumpmachine
Выводит целевую машину компилятора (например, ‘i686-pc-linux-gnu’)—и ничего больше не делает.
-dumpversion
Выводит версию компилятора (например, ‘3.0’)—и ничего больше не делает.
-dumpspecs
Выводит встроенные спецификации компилятора — и ничего больше не делает. (Это используется при построении самого GCC.) См. Файлы спецификаций.
-fno-eliminate-unused-debug-types
Обычно, при создании вывода DWARF 2, GCC избегает создания отладочного символьного вывода для типов, которые нигде не используются в компилируемом исходном файле. Иногда полезно, чтобы GCC генерировал отладочную информацию для всех типов, объявленных в блоке компиляции, независимо от того, используются ли они в этом блоке компиляции или нет, например, если в отладчике вы хотите преобразовать значение в тип, который фактически не используется в вашей программе (но объявлен). Однако чаще всего это приводит к значительным потерям пространства.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Debugging-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API