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

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

В официальной документации gcc говорится только:

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

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


person Trevor    schedule 02.09.2011    source источник


Ответы (3)


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

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

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

...

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

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

См. Также Инструменты профилировщика против выборки

person Gregory Pakosz    schedule 03.09.2011

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

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

person Mike Dunlavey    schedule 03.09.2011
comment
Я почти все свое профилирование скорости выполнял, просто используя break и backtrace в gdb, с тех пор, как прочитал их. - person David Stone; 23.06.2012
comment
@David: У меня много аргументов по этому поводу, но я сделал этот пример с Это. 700-кратное ускорение. Я не говорю, что пауза - это красиво, но я знаю, что ни у кого не было такого результата. - person Mike Dunlavey; 23.06.2012
comment
@ duedl0r: Обновил ссылку. - person Mike Dunlavey; 09.07.2014

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

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

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

person laycat    schedule 15.09.2017