Spec-Zone.ru › GCC 7

3.11 Варианты инструментирования программ

GCC поддерживает ряд командно-строчных параметров, которые управляют добавлением инструментирования во время выполнения в генерируемый код. Например, одна из целей инструментирования — сбор статистики профилирования для поиска горячих точек программы, анализа покрытия кода или оптимизации, основанной на профиле. Другой класс инструментирования программ — добавление проверок во время выполнения для обнаружения ошибок программирования, таких как обращение к невалидному указателю или доступ к массиву за пределами границ, а также преднамеренных вредоносных атак, таких как разрушение стека или захват таблицы виртуальных функций C++. Также есть общий хук, который может быть использован для реализации других форм отслеживания или инструментирования на уровне функций для отладки или анализа программы.

-p

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

-pg

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

-fprofile-arcs

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

При завершении скомпилированной программы она сохраняет эти данные в файл с именем 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 (последнее подразумевает первое).
  • Запустите программу с представительной рабочей нагрузкой, чтобы сгенерировать информацию о профиле дуг. Это можно повторять любое количество раз. Вы можете запускать несколько экземпляров вашей программы, и при условии, что файловая система поддерживает блокировку, данные файлы будут правильно обновлены. Если не используется строгий вариант ISO C, fork вызовы будут обнаружены и правильно обработаны без двойного подсчёта.
  • Для оптимизации, основанной на профиле, снова скомпилируйте исходные файлы с теми же параметрами оптимизации и генерации кода плюс -fbranch-probabilities (см. Параметры, контролирующие оптимизацию).
  • Для анализа покрытия тестов используйте gcov для создания удобочитаемой информации из файлов .gcno и .gcda. Для получения дополнительной информации обратитесь к документации gcov.

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

-ftest-coverage

Создаёт файл заметок, который может использовать утилита gcov анализа покрытия кода (см. gcov—Программа анализа покрытия тестов) для отображения покрытия программы. Файл заметок каждого исходного файла называется auxname.gcno. Обратитесь к параметру -fprofile-arcs выше для описания auxname и инструкций по созданию данных анализа покрытия тестов. Данные покрытия тестов соответствуют исходным файлам лучше, если вы не используете оптимизацию.

-fprofile-dir=path

Устанавливает каталог для поиска файлов данных профиля в path. Этот параметр влияет только на данные профиля, генерируемые -fprofile-generate, -ftest-coverage, -fprofile-arcs и используемые -fprofile-use и -fbranch-probabilities и связанными параметрами. Можно использовать как абсолютные, так и относительные пути. По умолчанию GCC использует текущий каталог в качестве path, таким образом файл данных профиля появляется в том же каталоге, что и объектный файл.

-fprofile-generate
-fprofile-generate=path

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

Включаются следующие параметры: -fprofile-arcs, -fprofile-values, -fvpt.

Если указан path, GCC ищет файлы данных обратной связи профиля в path. См. -fprofile-dir.

Для оптимизации программы на основе собранной информации о профиле используйте -fprofile-use. См. Параметры оптимизации для получения дополнительной информации.

-fprofile-update=method

Изменяет метод обновления для приложения, инструментированного для оптимизации на основе обратной связи профиля. Аргумент method должен быть одним из «single», «atomic» или «prefer-atomic». Первый полезен для однопоточных приложений, в то время как второй предотвращает повреждение профиля, выдав код, безопасный для потоков.

Предупреждение: Когда приложение не объединяет все потоки должным образом (или создаёт отделённый поток), файл профиля всё ещё может быть повреждён.

Использование «prefer-atomic» будет преобразовано либо в «atomic», если это поддерживается целевой платформой, или в «single» в противном случае. Драйвер GCC автоматически выбирает «prefer-atomic», когда -pthread присутствует в командной строке.

-fsanitize=address

Включает AddressSanitizer, быстрый детектор ошибок памяти. Инструкции доступа к памяти инструментированы для обнаружения ошибок «доступ за пределы границ» и «использование после освобождения». Параметр включает -fsanitize-address-use-after-scope. См. https://github.com/google/sanitizers/wiki/AddressSanitizer для получения более подробной информации. Поведение во время выполнения можно настроить с помощью переменной окружения ASAN_OPTIONS. Если она установлена в значение help=1, доступные параметры отображаются при запуске инструментированной программы. См. https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run-time-flags для списка поддерживаемых параметров. Параметр не может быть объединён с -fsanitize=thread и/или -fcheck-pointer-bounds.

-fsanitize=kernel-address

Включает AddressSanitizer для ядра Linux. См. https://github.com/google/kasan/wiki для получения более подробной информации. Параметр не может быть объединён с -fcheck-pointer-bounds.

-fsanitize=thread

Включает ThreadSanitizer, быстрый детектор гонок данных. Инструкции доступа к памяти инструментированы для обнаружения гонок данных. См. https://github.com/google/sanitizers/wiki#threadsanitizer для получения более подробной информации. Поведение во время выполнения можно настроить с помощью переменной окружения TSAN_OPTIONS; см. https://github.com/google/sanitizers/wiki/ThreadSanitizerFlags для списка поддерживаемых параметров. Параметр не может быть объединён с -fsanitize=address, -fsanitize=leak и/или -fcheck-pointer-bounds.

Обратите внимание, что встроенные атомарные функции, связанные с инструментированием, не могут генерировать исключения при работе с недопустимыми адресами памяти с исключениями, не связанными с вызовом (-fnon-call-exceptions).

-fsanitize=leak

Включает LeakSanitizer, детектор утечек памяти. Этот параметр имеет значение только при компоновке исполняемых файлов, и исполняемый файл компонуется с библиотекой, которая перезаписывает malloc и другие функции выделения памяти. См. https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer для получения более подробной информации. Поведение во время выполнения можно настроить с помощью переменной окружения LSAN_OPTIONS. Параметр не может быть объединён с -fsanitize=thread.

-fsanitize=undefined
END_OF_DOCUMENT_MARKER

Включить UndefinedBehaviorSanitizer, быстрый детектор неопределенного поведения. Различные вычисления инструментированы для обнаружения неопределённого поведения во время выполнения. Текущие подварианты:

-fsanitize=shift

Этот параметр включает проверку того, что результат операции сдвига не является неопределённым. Обратите внимание, что то, что считается неопределённым, немного отличается между C и C++, а также между ISO C90 и C99 и т.д. Этот параметр имеет два подварианта, -fsanitize=shift-base и -fsanitize=shift-exponent.

-fsanitize=shift-exponent

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

-fsanitize=shift-base

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

Этот параметр включает инструментирование границ массивов. Различные обращения за пределами границ обнаруживаются. Члены массива гибкой длины, массивы, подобные членам массива гибкой длины, и инициализаторы переменных со статическим хранением не инструментируются. Параметр не может быть объединён с -fcheck-pointer-bounds.

-fsanitize=bounds-strict

Этот параметр включает жёсткое инструментирование границ массивов. Большинство обращений за пределами границ обнаруживаются, включая члены массивов гибкой длины и массивы, подобные членам массивов гибкой длины. Инициализаторы переменных со статическим хранением не инструментируются. Параметр не может быть объединён с -fcheck-pointer-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 не передаются в аргументы, помеченные как требующие ненулевого значения атрибутом функции 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-sections=s1,s2,...

Проверка глобальных переменных в выбранных пользователем секциях. si может содержать подстановочные знаки.

-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=bounds-strict, -fsanitize=kernel-address и -fsanitize=address. Для этих средств проверки режим восстановления включён по умолчанию, за исключением -fsanitize=address, для которого эта функция является экспериментальной. -fsanitize-recover=all и -fno-sanitize-recover=all также принимаются; первый включает восстановление для всех средств проверки, поддерживающих его, а второй отключает восстановление для всех средств проверки, поддерживающих его.

Даже если режим восстановления включен на стороне компилятора, он должен быть также включен на стороне библиотеки времени выполнения, иначе ошибки всё равно являются фатальными. Библиотека времени выполнения по умолчанию устанавливает значение halt_on_error=0 для ThreadSanitizer и UndefinedBehaviorSanitizer, в то время как значение по умолчанию для AddressSanitizer — halt_on_error=1. Это может быть переопределено путем установки флага halt_on_error в соответствующей переменной среды.

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

undefined,float-cast-overflow,float-divide-by-zero,bounds-strict
-fsanitize-address-use-after-scope

Включить проверку локальных переменных для обнаружения ошибок использования после выхода из области видимости. Параметр устанавливает -fstack-reuse на ‘none’.

-fsanitize-undefined-trap-on-error

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

-fsanitize-coverage=trace-pc

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

-fbounds-check

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

-fcheck-pointer-bounds

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

В настоящее время реализация доступна только для Intel MPX, поэтому для включения этой функции требуются целевой x86 GNU/Linux и опция -mmpx. Инструментирование на основе MPX требует библиотеки времени выполнения для активации MPX в оборудовании и обработки сигналов нарушения границ. По умолчанию, при использовании опций -fcheck-pointer-bounds и -mmpx для линковки программы, драйвер GCC линксирует с библиотеками libmpx и libmpxwrappers. Проверка границ при вызовах динамических библиотек требует линкера с поддержкой -z bndplt; если GCC был сконфигурирован с линком без поддержки этой опции (включая Gold-линкер и более старые версии ld), выдается предупреждение, если вы линксируете с -mmpx, не указав также -static, так как общая эффективность защиты проверки границ снижается. См. также -static-libmpxwrappers.

Инструментирование на основе 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 также предоставляет ряд встроенных функций для управления Pointer Bounds Checker. См. Встроенные функции Pointer Bounds Checker для получения дополнительной информации.

-fchkp-check-incomplete-type

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

-fchkp-narrow-bounds

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

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

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

-fchkp-flexible-struct-trailing-arrays

Принудительно заставляет Pointer Bounds Checker рассматривать все хвостовые массивы в структурах как потенциально гибкие. По умолчанию только массивы с нулевой длиной или помеченные атрибутом bnd_variable_size рассматриваются как гибкие.

-fchkp-narrow-to-innermost-array

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

-fchkp-optimize

Включает оптимизации Pointer Bounds Checker. Включено по умолчанию на уровнях оптимизации -O, -O2, -O3.

-fchkp-use-fast-string-functions

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

-fchkp-use-nochk-string-functions

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

-fchkp-use-static-bounds

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

-fchkp-use-static-const-bounds

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

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

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

-fchkp-check-read

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

-fchkp-check-write

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

-fchkp-store-bounds

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

-fchkp-instrument-calls

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

-fchkp-instrument-marked-only

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

-fchkp-use-wrappers

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

-fstack-protector

Генерировать дополнительный код для проверки переполнения буфера, например, атак типа "stack smashing". Это делается путем добавления защитной переменной к функциям с уязвимыми объектами. Это включает функции, которые вызывают alloca, и функции с буферами размером более 8 байт. Защитные переменные инициализируются при входе в функцию и затем проверяются при выходе из функции. Если проверка защитной переменной завершается неудачно, выводится сообщение об ошибке, и программа завершается.

-fstack-protector-all

Как -fstack-protector, но все функции защищены.

-fstack-protector-strong

Как -fstack-protector, но включает дополнительные функции для защиты — те, которые имеют локальные определения массивов или имеют ссылки на адреса локального кадра.

-fstack-protector-explicit

Как -fstack-protector, но защищает только те функции, которые имеют атрибут stack_protect.

-fstack-check

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

Обратите внимание, что этот переключатель фактически не выполняет проверки; операционная система или среда выполнения языка должны это сделать. Переключатель вызывает генерацию кода для обеспечения того, чтобы они видели расширение стека.

Вы можете дополнительно указать строковый параметр: ‘no’ означает отсутствие проверки, ‘generic’ означает принудительное использование проверки старого стиля, ‘specific’ означает использование лучшего метода проверки и эквивалентно чистому -fstack-check.

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

  1. Измененная стратегия выделения памяти для больших объектов: они всегда выделяются динамически, если их размер превышает фиксированный порог.
  2. Фиксированный лимит на размер статической области функций: когда он заполнен конкретной функцией, проверка стека ненадежна, и компилятор выдает предупреждение.
  3. Неэффективность: из-за модифицированной стратегии выделения и универсальной реализации производительность кода снижается.

Обратите внимание, что проверка стека старого стиля также является резервным методом для ‘specific’, если в компиляторе не добавлена поддержка целевой платформы.

-fstack-limit-register=reg
-fstack-limit-symbol=sym
-fno-stack-limit

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

Например, если стек начинается по абсолютному адресу ‘0x80000000’ и растет вниз, вы можете использовать флаги -fstack-limit-symbol=__stack_limit и -Wl,--defsym,__stack_limit=0x7ffe0000 для принудительного ограничения размера стека до 128 КБ. Обратите внимание, что это может работать только с GNU-линкером.

Вы можете локально переопределить проверку ограничения стека, используя атрибут функции no_stack_limit (см. Атрибуты функций).

-fsplit-stack

Генерировать код для автоматического разделения стека перед его переполнением. Результирующая программа имеет несмежный стек, который может переполниться только в том случае, если программа не сможет выделить больше памяти. Это наиболее полезно при работе с многопоточными программами, так как больше не нужно вычислять хороший размер стека для каждого потока. В настоящее время это реализовано только для целевых платформ x86, работающих под GNU/Linux.

Когда код, скомпилированный с -fsplit-stack, вызывает код, скомпилированный без -fsplit-stack, для последнего кода может быть недостаточно места в стеке. Если компиляция всего кода, включая код библиотеки, с -fsplit-stack не является вариантом, тогда линкер может исправить эти вызовы, чтобы код, скомпилированный без -fsplit-stack, всегда имел большой стек. Поддержка этого реализована в линковщике gold в выпуске GNU binutils 2.21 и более поздних.

-fvtable-verify=[std|preinit|none]

Этот параметр доступен только при компиляции кода C++. Он включает (или выключает, если используется -fvtable-verify=none) функцию безопасности, которая проверяет во время выполнения для каждого виртуального вызова, что указатель vtable, через который осуществляется вызов, действителен для типа объекта и не был повреждён или перезаписан. Если обнаруживается недействительный указатель vtable во время выполнения, сообщается об ошибке, и выполнение программы немедленно прерывается.

Этот параметр вызывает построение структур данных во время запуска программы, которые используются для проверки указателей vtable. Параметры ‘std’ и ‘preinit’ управляют временем построения этих структур данных. В обоих случаях структуры данных строятся до того, как выполнение достигнет main. Использование -fvtable-verify=std приводит к построению структур данных после загрузки и инициализации общих библиотек. -fvtable-verify=preinit приводит к их построению до загрузки и инициализации общих библиотек.

Если этот параметр встречается несколько раз в командной строке с разными значениями, ‘none’ имеет наивысший приоритет по отношению к ‘std’ и ‘preinit’; ‘preinit’ имеет приоритет над ‘std’.

-fvtv-debug

При использовании совместно с -fvtable-verify=std или -fvtable-verify=preinit, вызывает вызов отладочных версий функций времени выполнения для функции проверки vtable. Этот флаг также заставляет компилятор регистрировать информацию о том, какие указатели vtable он находит для каждого класса. Эта информация записывается в файл с именем vtv_set_ptr_data.log в каталоге, указанном переменной среды VTV_LOGS_DIR, если она определена, или в текущем рабочем каталоге в противном случае.

Примечание: Эта функция добавляет данные в файл журнала. Если вам нужен новый файл журнала, убедитесь, что вы удалили любой существующий.

-fvtv-counts

Это отладочный флаг. При использовании совместно с -fvtable-verify=std или -fvtable-verify=preinit, это заставляет компилятор отслеживать общее количество виртуальных вызовов, которые он встречает, и количество вставок проверок. Он также подсчитывает количество вызовов определённых функций библиотеки времени выполнения, которые он вставляет, и регистрирует эту информацию для каждого блока компиляции. Компилятор записывает эту информацию в файл с именем vtv_count_data.log в каталоге, указанном переменной среды VTV_LOGS_DIR, если она определена, или в текущем рабочем каталоге в противном случае. Он также подсчитывает размер наборов указателей vtable для каждого класса и записывает эту информацию в vtv_class_set_sizes.log в том же каталоге.

Примечание: Эта функция добавляет данные в файлы журналов. Чтобы получить новые файлы журналов, убедитесь, что вы удалили все существующие.

-finstrument-functions

Генерировать вызовы инструментирования для входа и выхода из функций. Сразу после входа в функцию и сразу перед выходом из функции вызываются следующие профилирующие функции с адресом текущей функции и её места вызова. (На некоторых платформах __builtin_return_address не работает за пределами текущей функции, поэтому информация о месте вызова может быть недоступна для профилирующих функций в противном случае.)

void __cyg_profile_func_enter (void *this_fn,
                               void *call_site);
void __cyg_profile_func_exit  (void *this_fn,
                               void *call_site);

Первый аргумент — адрес начала текущей функции, который можно найти точно в таблице символов.

Это инструментирование также выполняется для функций, расширенных встраиваемо в другие функции. Вызовы профилирования указывают, где концептуально происходит вход и выход встраиваемой функции. Это означает, что должны быть доступны адресуемые версии таких функций. Если все ваши использования функции расширены встраиваемо, это может означать дополнительное увеличение размера кода. Если вы используете extern inline в вашем коде C, должна быть предоставлена адресуемая версия таких функций. (Это обычно так и есть, но если вам повезёт, и оптимизатор всегда расширяет функции встраиваемо, возможно, вам удалось обойтись без предоставления статических копий.)

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

-finstrument-functions-exclude-file-list=file,file,…

Устанавливает список функций, которые исключаются из инструментирования (см. описание -finstrument-functions). Если файл, содержащий определение функции, соответствует одному из file, то эта функция не инструментируется. Сопоставление выполняется по подстрокам: если параметр file является подстрокой имени файла, он считается совпадением.

Например:

-finstrument-functions-exclude-file-list=/bits/stl,include/sys

исключает любые встраиваемые функции, определённые в файлах, пути к которым содержат /bits/stl или include/sys.

Если по какой-либо причине вы хотите включить символ ‘,’ в одном из sym, напишите ‘\,’. Например, -finstrument-functions-exclude-file-list='\,\,tmp' (обратите внимание на одиночные кавычки, окружающие параметр).

-finstrument-functions-exclude-function-list=sym,sym,…

Это аналогично -finstrument-functions-exclude-file-list, но этот параметр устанавливает список имён функций, которые нужно исключить из инструментирования. Имя функции, на которое необходимо сопоставить, это её видимое имя пользователя, такое как vector<int> blah(const vector<int> &), а не внутреннее искажённое имя (например, _Z4blahRSt6vectorIiSaIiEE). Сопоставление выполняется по подстрокам: если параметр sym является подстрокой имени функции, он считается совпадением. Для идентификаторов C99 и расширенных идентификаторов C++ имя функции должно быть указано в UTF-8, а не с использованием универсальных символьных имен.

Следующая: Параметры препроцессора, Предыдущая: Параметры оптимизации, Вверх: Вызов GCC [Оглавление][Указатель]

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

Spec-Zone.ru

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