Мой проект в настоящее время имеет библиотеку, которая статически связана (скомпилирована с помощью gcc и связана с ar), но в настоящее время я пытаюсь профилировать весь мой проект с помощью gprof, в котором я также хотел бы профилировать эту статически связанную библиотеку. Есть ли способ сделать это?
Gprof требует, чтобы вы указали -pg для GCC для компиляции и -pg для компоновщика. Однако ar жалуется, когда в список флагов для него добавляется -pg.
Я давно не пользовался gprof, но это -pg даже верный аргумент ar
? Работает ли профилирование, если вы скомпилируете все объекты с помощью -pg, а затем создадите свой архив без -pg?
Если вы не можете заставить gprof работать, gperftools содержит профилировщик процессора, который, я думаю, должен хорошо работать в этом случае. Вам не нужно компилировать ваше приложение с какими-либо специальными флагами, и вам не нужно пытаться изменить то, как связана ваша статическая библиотека.
Прежде чем начать, есть два компромисса, связанных с использованием 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 для профилирования приложений, связанных с вводом-выводом, и задокументировал многие из моих выводов. Вот. Многое совпадает с тем, что вы пытаетесь сделать, так что, возможно, это будет полезно.
Других решений пока нет …