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или опции-dletters. Вот возможные символы для использования в 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-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