Как заставить linux 'perf record' работать для символов libc и libstdc ++?

12

Я использую perf record -gна x86-64 Linux для профилирования программы. Некоторые символы в libc или libstdc ++ имеют 0в качестве родителя: __GI___strcmp_ssse3(libc) и strcmp@plt(libstdc ++), например. (Я действительно могу разбить эти символы в отладчике и получить обратную трассировку.)

Я хотел бы знать, каковы основные вызывающие стороны этих функций и почему они не записываются. Это потому, что libc и libstdc ++ не имеют указателей фреймов на x86_64? И, более практично, есть ли способ обойти это?

Бенджамин Ределингс
источник

Ответы:

5

Это старый вопрос, но теперь это возможно --call-graph dwarf. Со страницы руководства:

 -g
       Enables call-graph (stack chain/backtrace) recording.

   --call-graph
       Setup and enable call-graph (stack chain/backtrace) recording, implies -g.

           Allows specifying "fp" (frame pointer) or "dwarf"
           (DWARF's CFI - Call Frame Information) as the method to collect
           the information used to show the call graphs.

           In some systems, where binaries are build with gcc
           --fomit-frame-pointer, using the "fp" method will produce bogus
           call graphs, using "dwarf", if available (perf tools linked to
           the libunwind library) should be used instead.

Я полагаю, что для этого требуется несколько новое ядро ​​Linux (> = 3.9? Я не совсем уверен). Вы можете проверить, связан ли пакет perf вашего дистрибутива с libdw или с libunwind readelf -d $(which perf) | grep -e libdw -e libunwind. На Fedora 20 perf связана с libdw.

ajduff574
источник
perf record --call-graph dwarfрешает эту проблему для меня. к сожалению, кажется, что у perf возникают проблемы с отображением графов вызовов (то есть "инвертированных") при использовании информации дварфов. Вот почему я начал использовать FlameGraph для визуализации.
синий
обратите внимание, что использование раскручивания
дварфов
-2

perfэто инструмент ядра, который показывает время, затраченное на системные вызовы Вы ищете GNU gprof. msgstr "gprof - отобразить данные профиля графа вызовов". Чтобы использовать gprof, вам нужно скомпилировать ваши исходники с помощью -pgключа.

Помимо этого есть много сложных инструментов профилирования, как eclipse-cdt-profiling-framework.


источник