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

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

22 голосов
/ 03 сентября 2011

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

Официальная документация gcc только заявляет :

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

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

Ответы [ 3 ]

19 голосов
/ 03 сентября 2011

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

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

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

...

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

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

См. Также Профилировщики Инструментарий против сэмплирования

6 голосов
/ 03 сентября 2011

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

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

0 голосов
/ 15 сентября 2017

Из этого источника: https://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf:

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

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

...