Spec-Zone.ru › GCC 5

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 или 5; по умолчанию версия для большинства целей — 4. Версия DWARF 5 находится в экспериментальной стадии.

Обратите внимание, что с 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.

-gz[=type]

Создать сжатые секции отладки в формате DWARF, если это поддерживается. Если type не задан, тип по умолчанию зависит от возможностей используемого ассемблера и линковщика. type может быть ‘none’ (не сжимать секции отладки), ‘zlib’ (использовать сжатие zlib в формате ELF gABI) или ‘zlib-gnu’ (использовать сжатие zlib в традиционном формате GNU). Если линковщик не поддерживает запись сжатых секций отладки, опция отклоняется. В противном случае, если ассемблер их не поддерживает, -gz будет проигнорировано при создании объектных файлов.

-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/kasan/wiki для получения дополнительной информации.

-fsanitize=thread

Включить ThreadSanitizer — быстрый детектор гонок данных. Инструкции доступа к памяти снабжаются инструментированием для обнаружения ошибок гонок данных. См. https://github.com/google/sanitizers/wiki#threadsanitizer для получения дополнительной информации. Поведение во время выполнения можно изменить, используя переменную окружения 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

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

-fsanitize=null

Этот параметр включает проверку указателей. В частности, приложение, построенное с этим параметром включённым, выведет сообщение об ошибке, когда оно попытается разыменовать указатель NULL, или если ссылка (возможно, ссылка rvalue) связана с указателем NULL, или если метод вызывается на объекте, на который указывает указатель NULL.

-fsanitize=return

Этот параметр включает проверку оператора return. Программы, построенные с этим параметром включённым, выдадут сообщение об ошибке, когда будет достигнут конец функции, не являющейся void, без фактического возврата значения. Этот параметр работает только в C++.

-fsanitize=signed-integer-overflow

Этот параметр включает проверку переполнения знакового целого. Мы проверяем, что результат +, *, и как унарных, так и бинарных - не переполняет в знаковом арифметике. Обратите внимание, что необходимо учитывать правила продвижения целых чисел. То есть, следующее не является переполнением:

signed char a = SCHAR_MAX;
a++;
-fsanitize=bounds

Этот параметр включает инструментирование границ массива. Обнаружаются различные обращения за пределы границ. Не инструментируются члены массива с гибким размером, массивы, подобные членам массива с гибким размером, и инициализаторы переменных со статическим хранением.

-fsanitize=alignment

Этот параметр включает проверку выравнивания указателей при разыменовании, или при связывании ссылки с недостаточно выровненной целью, или при вызове метода или конструктора на недостаточно выровненном объекте.

-fsanitize=object-size

Этот параметр включает инструментирование обращений к памяти с использованием функции __builtin_object_size. Обнаружаются различные обращения за пределы границ указателя.

-fsanitize=float-divide-by-zero

Обнаружение деления с плавающей точкой на ноль. В отличие от других аналогичных параметров, -fsanitize=float-divide-by-zero не включён параметром -fsanitize=undefined, так как деление с плавающей точкой на ноль может быть законным способом получения бесконечностей и NaN.

-fsanitize=float-cast-overflow

Этот параметр включает проверку преобразования типа с плавающей точкой в целочисленный тип. Мы проверяем, что результат преобразования не переполняет. В отличие от других аналогичных параметров, -fsanitize=float-cast-overflow не включён параметром -fsanitize=undefined. Этот параметр не работает хорошо с включенными исключениями FE_INVALID.

-fsanitize=nonnull-attribute

Этот параметр включает инструментирование вызовов, проверяя, что значения NULL не передаются в аргументы, отмеченные как требующие значения не NULL, с помощью атрибута функции nonnull.

-fsanitize=returns-nonnull-attribute

Этот параметр включает инструментирование операторов return в функциях, отмеченных атрибутом функции returns_nonnull, для обнаружения возвращаемых значений NULL из таких функций.

-fsanitize=bool

Этот параметр включает инструментирование загрузки из bool. Если загружается значение, отличное от 0/1, выдаётся ошибка во время выполнения.

-fsanitize=enum

Этот параметр включает инструментирование загрузки из типа перечисления. Если загружается значение, выходящее за пределы диапазона значений для типа перечисления, выдаётся ошибка во время выполнения.

-fsanitize=vptr

Этот параметр включает инструментирование вызовов функций-членов C++, доступа к членам и некоторых преобразований между указателями на базовый и производный классы для проверки, что объект, на который ссылаются, имеет правильный динамический тип.

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

-fno-sanitize=all

Этот параметр отключает все ранее включённые санитайзеры. -fsanitize=all не разрешается, так как некоторые санитайзеры не могут использоваться вместе.

-fasan-shadow-offset=number

Этот параметр заставляет GCC использовать пользовательский смещение тени в проверках AddressSanitizer. Это полезно для экспериментов с различными макетами памяти тени в санитайзере ядра AddressSanitizer.

-fsanitize-recover[=opts]

-fsanitize-recover= управляет режимом восстановления ошибок для санитайзеров, упомянутых в списке opts, разделённом запятыми. Включение этого параметра для компонента санитайзера заставляет его попытаться продолжить выполнение программы, как если бы никакой ошибки не произошло. Это означает, что несколько ошибок во время выполнения могут быть сообщены в одном запуске программы, и код завершения программы может указывать на успех, даже если ошибки были сообщены. Параметр -fno-sanitize-recover= может быть использован для изменения этого поведения: только первая обнаруженная ошибка сообщается, и программа затем завершается с ненулевым кодом выхода.

В настоящее время эта функция работает только для -fsanitize=undefined (и его подвариантов, за исключением -fsanitize=unreachable и -fsanitize=return), -fsanitize=float-cast-overflow, -fsanitize=float-divide-by-zero и -fsanitize=kernel-address. Для этих санитайзеров восстановление от ошибок включено по умолчанию. -fsanitize-recover=all и -fno-sanitize-recover=all также принимаются, первое включает восстановление для всех санитайзеров, которые его поддерживают, последнее отключает восстановление для всех санитайзеров, которые его поддерживают.

Синтаксис без явного параметра opts устарел. Он эквивалентен

-fsanitize-recover=undefined,float-cast-overflow,float-divide-by-zero

Аналогично, -fno-sanitize-recover эквивалентно

-fno-sanitize-recover=undefined,float-cast-overflow,float-divide-by-zero
-fsanitize-undefined-trap-on-error

Параметр -fsanitize-undefined-trap-on-error инструктирует компилятор сообщать об неопределённом поведении с помощью __builtin_trap вместо процедуры библиотеки libubsan. Преимущество этого заключается в том, что библиотека libubsan не нужна и не подключается, поэтому это пригодно даже в автономных средах.

-fcheck-pointer-bounds

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

В настоящее время существует только реализация для Intel MPX, поэтому для включения этой функции требуется целевая архитектура x86 и -mmpx. Инструментирование на основе MPX требует библиотеки времени выполнения для включения MPX в аппаратном обеспечении и обработки сигналов нарушения границ. По умолчанию при использовании параметров -fcheck-pointer-bounds и -mmpx для компиляции программы, драйвер GCC подключает библиотеку времени выполнения libmpx и библиотеку libmpxwrappers. Он также передает ’-z bndplt’ линкеру, если он поддерживает этот параметр (что проверяется при конфигурации libmpx). Обратите внимание, что старые версии линковщика могут игнорировать параметр. Золотой линкер не поддерживает параметр ’-z bndplt’. Без поддержки ’-z bndplt’ в линкере все вызовы динамических библиотек теряют переданные границы, уменьшая общий уровень защиты. Настоятельно рекомендуется использовать линкер с поддержкой ’-z bndplt’. В случае отсутствия такого линковщика рекомендуется всегда использовать -static-libmpxwrappers для повышения уровня защиты или использовать -static для полного избегания внешних вызовов динамических библиотек. Инструментирование на основе MPX может использоваться для отладки, а также может быть включено в производственный код для повышения безопасности программы. В зависимости от использования, у вас могут быть разные требования к библиотеке времени выполнения. Текущая версия библиотеки времени выполнения MPX больше ориентирована на использование в качестве инструмента отладки. Использование библиотеки времени выполнения MPX подразумевает -lpthread. Смотрите также -static-libmpx. Поведение библиотеки времени выполнения может влиять на различные переменные среды CHKP_RT_*. Дополнительные сведения см. в https://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler.

Сгенерированное инструментирование может управляться различными параметрами -fchkp-* и полем структуры bnd_variable_size (см. Атрибуты типов) и bnd_legacy, и атрибутами функций bnd_instrument (см. Атрибуты функций). GCC также предоставляет ряд встроенных функций для управления Проверяющим границ указателей. Дополнительную информацию см. в Встроенные функции Проверяющего границ указателей.

-fchkp-check-incomplete-type

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

-fchkp-narrow-bounds

Управляет границами, используемыми Проверяющим границ указателей для указателей на поля объекта. Если сужение включено, используются границы поля. В противном случае используются границы объекта. Смотрите также -fchkp-narrow-to-innermost-array и -fchkp-first-field-has-own-bounds. Включено по умолчанию.

-fchkp-first-field-has-own-bounds

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

-fchkp-narrow-to-innermost-array

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

-fchkp-optimize

Включает оптимизации Проверяющего границ указателей. Включено по умолчанию на уровнях оптимизации -O, -O2, -O3.

-fchkp-use-fast-string-functions

Включает использование *_nobnd версий функций строк (без копирования границ) проверкой границ указателей. Отключено по умолчанию.

-fchkp-use-nochk-string-functions

Включает использование *_nochk версий функций строк (без проверки границ) проверкой границ указателей. Отключено по умолчанию.

-fchkp-use-static-bounds

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

-fchkp-use-static-const-bounds

Использовать статически инициализированные границы для постоянных границ вместо их генерации каждый раз, когда они требуются. По умолчанию включено, когда включен -fchkp-use-static-bounds.

-fchkp-treat-zero-dynamic-size-as-infinite

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

-fchkp-check-read

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

-fchkp-check-write

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

-fchkp-store-bounds

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

-fchkp-instrument-calls

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

-fchkp-instrument-marked-only

Инструктирует проверку границ указателей производить инструментирование только функций, помеченных атрибутом bnd_instrument (см. Атрибуты функций). Отключено по умолчанию.

-fchkp-use-wrappers

Разрешает проверке границ указателей заменять вызовы встроенных функций на вызовы функций-оберток. При использовании -fchkp-use-wrappers для компоновки программы, драйвер GCC автоматически подключает libmpxwrappers. См. также -static-libmpxwrappers. Включено по умолчанию.

-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 — это список диапазонов функций или имен ассемблера, разделённых запятыми. Каждый диапазон — это пара чисел, разделённых двоеточием. Диапазон включительно для обоих концов. Если диапазон тривиален, пару чисел можно упростить до одного числа. Если узел узла вызова функции в графе вызовов находится в одном из указанных диапазонов, 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

Дамп после дублирования вычисленных переходов goto.

-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

Дамп после оптимизаций вызовов с помощью sibling.

-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/данных/кучи/стека/dso.

-freport-bug

Собирает и выводит отладочную информацию в временный файл, если произошла ошибка ICE в компиляторе C/C++.

-fdump-unnumbered

При создании отладочных дампов (см. опцию -d выше) подавляет вывод номеров инструкций и адресов. Это делает более возможным использование diff на отладочных дампах для вызовов компилятора с разными опциями, в частности, с -g и без него.

-fdump-unnumbered-links

При создании отладочных дампов (см. опцию -d выше), подавляет вывод номеров инструкций для ссылок на предыдущую и следующую инструкции в последовательности.

-fdump-translation-unit (C++ only)
-fdump-translation-unit-options (C++ only)

Выводит представление древовидной структуры для всего блока трансляции в файл. Имя файла создаётся путём добавления .tu к имени файла исходного кода, и файл создаётся в той же директории, что и выходной файл. Если используется форма -options, options управляет деталями дампов, как описано для опции -fdump-tree.

-fdump-class-hierarchy (C++ only)
-fdump-class-hierarchy-options (C++ only)

Выводит представление иерархии каждого класса и расположение таблиц виртуальных функций в файл. Имя файла создаётся путём добавления .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’

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

‘note’

Включает другую подробную оптимизационную информацию (доступно только в определенных проходах).

‘=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’

Выводит информацию, когда оптимизация успешно применена. Отдельные проходы решают, какая информация актуальна. Например, проходы векторизации выводят расположение исходного кода циклов, которые успешно векторизированы.

‘missed’

Выводит информацию о пропущенных оптимизациях. Индивидуальные проходы контролируют, какую информацию включать в вывод.

‘note’

Выводит подробную информацию об оптимизациях, такую как определённые преобразования, более подробные сообщения о принятых решениях и т. д.

‘all’

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

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

‘ipa’

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

‘loop’

Включает вывод дампов всех оптимизаций циклов.

‘inline’

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

‘vec’

Включает вывод дампов всех оптимизаций векторизации.

‘optall’

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

Если options опущено, оно по умолчанию устанавливается в ‘optimized-optall», что означает вывод всей информации об успешных оптимизациях всех проходов.

Если задан filename, то дампы от всех применимых оптимизаций конкатенируются в filename. В противном случае дамп выводится в stderr. Хотя принимаются несколько опций -fopt-info, только одна из них может включать filename. Если указаны другие имена файлов, то все, кроме первого, игнорируются.

Обратите внимание, что выходной filename перезаписывается в случае нескольких единиц трансляции. Если требуется комбинированный вывод из нескольких единиц трансляции, следует использовать stderr.

В следующем примере информация об оптимизации выводится в stderr:

gcc -O3 -fopt-info

Этот пример:

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

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

gcc -O2 -ftree-vectorize -fopt-info-vec-missed

выводит информацию о пропущенных возможностях оптимизации из проходов векторизации в stderr. Обратите внимание, что -fopt-info-vec-missed эквивалентно -fopt-info-missed-vec.

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

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

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

Наконец, рассмотрим:

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

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

-frandom-seed=string

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

Строка string может быть числом (десятичным, восьмеричным или шестнадцатеричным) или произвольной строкой (в этом случае она преобразуется в число путём вычисления CRC32).

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

-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 и multilib не используются, это обычно просто ., если библиотеки ОС присутствуют в подкаталогах 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 выполняет поиск — и ничего больше не делает.

Это полезно, когда gcc выводит сообщение об ошибке «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 генерировал информацию об отладке для всех типов, объявленных в единице компиляции, независимо от того, используются ли они в этой единице компиляции или нет, например, если в отладчике вы хотите привести значение к типу, который фактически не используется в вашей программе (но объявлен). Однако чаще это приводит к значительному количеству ненужных данных.

Далее: Опции оптимизации, Предыдущее: Опции предупреждений, Вверх: Вызов GCC [Содержание][Индекс]

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

Spec-Zone.ru

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