Spec-Zone.ru › GCC 6

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

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

-p

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

-pg

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

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

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

-ftest-coverage

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

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

-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=bounds-strict

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

-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 не передаются в аргументы, помеченные как требующие значения non-null с помощью атрибута функции nonnull.

-fsanitize=returns-nonnull-attribute

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

-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. Это полезно для экспериментов с различными макетами памяти тени в Kernel 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=kernel-address и -fsanitize=address. Для этих санитайзеров восстановление ошибок включено по умолчанию, за исключением -fsanitize=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 не требуется и не подключается, что делает её пригодной даже в автономных средах.

-fsanitize-coverage=trace-pc

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

-fbounds-check

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

-fcheck-pointer-bounds

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

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

-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. Включено по умолчанию.

-fstack-protector

Выпустить дополнительный код для проверки переполнения буфера, такого как атаки с нарушениями стека. Это делается путём добавления защитной переменной к функциям с уязвимыми объектами. Это включает функции, которые вызывают 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-6.5.0/gcc/Instrumentation-Options.html

Spec-Zone.ru

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