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

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

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


person jab    schedule 05.12.2013    source источник


Ответы (1)


Я давно не использовал 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 для профилирования приложений с привязкой к вводу-выводу, и я задокументировал многие свои выводы здесь. Есть много общего с тем, что вы пытаетесь сделать, так что, возможно, это будет полезно.

person John Saxton    schedule 05.12.2013