gprof: как создать граф вызовов для функций в разделяемой библиотеке, связанной с основной программой - PullRequest
22 голосов
/ 03 декабря 2009

Я работаю в среде Linux. У меня есть два исходных пакета 'C' train и test_train.

  1. пакет train при компиляции генерирует libtrain.so
  2. test_train ссылается на libtrain.so и генерирует исполняемый поезд-тест

Теперь я хочу сгенерировать граф вызовов, используя gprof, который показывает последовательность вызова функций в основной программе, а также функции внутри libtrain.so

Я компилирую и связываю оба пакета с параметром -pg, а уровень отладки равен o0. После того, как я сделаю ./train-test, генерируется gmon.out. Тогда я делаю:

$ gprof -q ./train-test gmon.out

Здесь выходные данные показывают график вызовов функций в train-test, но не в libtrain.so

В чем может быть проблема?

Ответы [ 3 ]

19 голосов
/ 10 февраля 2011

gprof не будет работать, вам нужно использовать sprof вместо этого. Я нашел эти ссылки полезными:

Сводка по 2-й ссылке:

  1. Скомпилируйте вашу общую библиотеку (libmylib.so) в режиме отладки (-g). Нет -pg.
  2. export LD_PROFILE_OUTPUT = `pwd`
  3. export LD_PROFILE = libmylib.so
  4. rm -f $ LD_PROFILE.profile
  5. выполнить вашу программу, которая загружает libmylib.so
  6. sprof PATH-TO-LIB / $ LD_PROFILE $ LD_PROFILE.profile -p> log
  7. см. Журнал.

Я обнаружил, что на шаге 2 это должен быть существующий каталог - в противном случае вы получите полезное предупреждение. И на шаге 3 вам может потребоваться указать библиотеку как libmylib.so.X (может быть, даже .X.Y, не уверен), иначе вы не получите никакого предупреждения.

2 голосов
/ 27 октября 2016

Я загружаю свою библиотеку из Python, и мне не повезло с sprof. Вместо этого я использовал oprofile, который был в репозиториях Fedora, по крайней мере:

operf --callgraph /path/to/mybinary

Подождите, пока ваше приложение завершит работу или выполните Ctl-c, чтобы прекратить профилирование. Теперь давайте сгенерируем резюме профиля:

opreport --callgraph --symbols

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

0 голосов
/ 01 сентября 2011

Если вы не в Linux (как я в Solaris), вам просто не повезло, поскольку там нет sprof. Если у вас есть источники вашей библиотеки, вы можете решить свою проблему, связав статическую библиотеку и сделав вместо нее свой бинарный файл профилирования. Другой способ, которым мне удается отследить вызовы к разделяемым библиотекам, - использование truss. С опцией -u [!]lib,...:[:][!]func, ... можно получить хорошее представление об истории вызовов прогона. Это не совсем то же самое, что профилирование, но может быть очень полезным в некоторых сценариях.

...