Как добавить компиляцию для профилирования в статическую библиотеку?

Мой проект в настоящее время имеет библиотеку, которая статически связана (скомпилирована с помощью gcc и связана с ar), но в настоящее время я пытаюсь профилировать весь мой проект с помощью gprof, в котором я также хотел бы профилировать эту статически связанную библиотеку. Есть ли способ сделать это?

Gprof требует, чтобы вы указали -pg для GCC для компиляции и -pg для компоновщика. Однако ar жалуется, когда в список флагов для него добавляется -pg.

2

Решение

Я давно не пользовался gprof, но это -pg даже верный аргумент ar? Работает ли профилирование, если вы скомпилируете все объекты с помощью -pg, а затем создадите свой архив без -pg?

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

Прежде чем начать, есть два компромисса, связанных с использованием gperftools, о которых вы должны знать:

  • gperftools это профилировщик выборки. Таким образом, ваши результаты не будут на 100%
    точно, но они должны быть действительно хорошими. Большой потенциал использования
    Выборочный профилировщик заключается в том, что он не сильно замедлит работу вашего приложения.
  • В многопоточных приложениях, по моему опыту, gperftools будет только
    профиль основной темы. Единственный способ, которым я смог успешно
    Профиль рабочих потоков, добавив код профилирования в мое приложение.
    С учетом сказанного, профилирование основного потока не должно требовать никакого кода
    изменения.

Есть много разных способов использования gperftools. Мой предпочтительный способ — загрузить библиотеку gperftools $LD_PRELOAD, укажите место регистрации $CPUPROFILEи, возможно, увеличить частоту дискретизации с $CPUPROFILE_FREQUENCY перед запуском моей заявки. Что-то вроде этого:

 export LD_PRELOAD=/usr/lib/libprofiler.so
export CPUPROFILE=/tmp/prof.out
export CPUPROFILE_FREQUENCY=10000
./my_application

Это запишет кучу профилирующей информации в /tmp/prof.out. Вы можете запустить сценарий постобработки, чтобы преобразовать этот файл во что-то удобочитаемое человеком. Есть много поддерживаемые форматы вывода — мой любимый — callgrind:

google-pprof --callgrind /path/to/my_application /tmp/prof.out > callgrind.dat
kcachegrind callgrind.dat &

Это должно обеспечить хорошее представление о том, где ваша программа проводит свое время.

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

3

Другие решения

Других решений пока нет …