Подтвердить что ты не робот

Как работает флаг gcc -pg?

Я пытаюсь понять, как работает флаг -pg (или -p) при компиляции кода C с помощью gcc.

Официальная документация gcc содержит только сообщения:

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

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

4b9b3361

Ответ 1

Компиляция с помощью -pg включает ваш код, чтобы gprof сообщал подробную информацию, см. gprof manual, 9.1 Реализация профилирования

Профилирование работает, изменяя, как скомпилирована каждая функция в вашей программе, чтобы при ее вызове она выдала некоторую информацию о том, откуда она была вызвана. Из этого профилировщик может определить, какую функцию он назвал, и может подсчитать, сколько раз он был вызван. Это изменение выполняется компилятором, когда ваша программа скомпилирована с опцией -pg, которая заставляет каждую функцию вызывать mcount (или _mcount или __mcount, в зависимости от ОС и компилятора) как один из своих первые операции.

Подпрограмма mcount, включенная в библиотеку профилирования, отвечает за запись в таблицу графиков вызовов внутри памяти как своей родительской подпрограммы (дочернего элемента), так и ее родительского родителя. Обычно это делается путем проверки фрейма стека, чтобы найти как адрес дочернего элемента, так и адрес возврата в исходном родителе. Так как это очень зависящая от машины операция, сама mcount обычно представляет собой короткую процедуру заглушения на языке ассемблера, которая извлекает требуемую информацию, а затем вызывает __mcount_internal (нормальную функцию C) с двумя аргументами <<29 > и selfpc. __mcount_internal отвечает за поддержание графика вызовов в памяти, который записывает frompc, selfpc и количество раз, когда каждая из этих дуг вызова была пройдена.

...

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

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

См. также Профилировщики сэмплирования Vs Sampling

Ответ 2

Эта ссылка дает краткое объяснение того, как работает gprof.

Эта ссылка дает обширную критику. (Проверьте мой ответ на заархивированный вопрос.)

Ответ 3

источник: http://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf

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

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