Jak sprawić, by linux „perf record” działał dla symboli libc i libstdc ++?

12

Używam perf record -gna Linuksie x86-64 do profilowania programu. Kilka symboli w libc lub libstdc ++ ma 0jako element nadrzędny: na przykład __GI___strcmp_ssse3(libc) i strcmp@plt(libstdc ++). (Naprawdę mogę włamać się do tych symboli w debuggerze i uzyskać ślad wstecz.)

Chciałbym wiedzieć, jakie są główne funkcje wywołujące te funkcje i dlaczego nie są rejestrowane. Czy to dlatego, że libc i libstdc ++ nie mają wskaźników ramek na x86_64? A, bardziej praktycznie, czy jest jakiś sposób na obejście tego?

Benjamin Redelings
źródło

Odpowiedzi:

5

To stare pytanie, ale teraz jest to możliwe dzięki --call-graph dwarf. Ze strony podręcznika:

 -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.

Uważam, że wymaga to nieco nowego jądra Linuksa (> = 3,9? Nie jestem do końca pewien). Możesz sprawdzić, czy pakiet perf twojej dystrybucji jest połączony z libdw lub libunwind z readelf -d $(which perf) | grep -e libdw -e libunwind. W Fedorze 20 perf jest połączony z libdw.

ajduff574
źródło
perf record --call-graph dwarfrozwiązuje ten problem dla mnie. niestety wydaje się, że perf ma problemy z wyświetlaniem grafów wywołań opartych na abonentach (tj. „odwróconych”) podczas korzystania z informacji karła. Dlatego zacząłem używać FlameGraph do wizualizacji.
niebieski
zauważ, że użycie odwijania karła powoduje bardzo znaczne obciążenie podczas profilowania
Azsgy,
-2

perfto narzędzie jądra, które pokazuje upływ czasu na wywołania systemowe. Szukasz GNU gprof. „gprof - wyświetl dane profilu wykresu połączeń”. Aby użyć gprof, musisz skompilować źródła za pomocą -pgprzełącznika.

Oprócz tego istnieje wiele wyrafinowanych narzędzi do profilowania, takich jak eclipse-cdt-profiling-framework.


źródło