Chciałem zrobić perfekcję, aby profilować niektóre programy po tym, jak zobaczyłem this rozmowę z CppCon 2015. Pobrałem tę samą bibliotekę testową Google, której używa gość w rozmowie, skompilowałem program z odpowiednimi przełącznikami , połączyłem go z nim, a następnie użyłem perf, aby nagrać przebieg. Opcja raport daje mi to:Perf pokazuje zniekształcone nazwy funkcji
Jak widać nazwy funkcji nie są bardzo czytelne. Zakładam, że ma to związek z mangowaniem nazw w C++. Co ciekawe, wszystkie nazwy funkcji pojawiają się poprawnie w filmie dla faceta, który wygłaszał przemówienie, ale nie dla mnie. Nie sądzę, że jest to przypadek całkowitego braku informacji o symbolu, ponieważ widzę w tym przypadku tylko adresy pamięci. Z jakiegoś powodu perf nie może "cofnąć" mylingowania nazwy C++, co jest frustrujące.
Używam gcc (g ++) wersja 5.2.1, wersja 4.2.6 jest perf i używam tych przełączników podczas kompilacji:
-I<my own include path> -L<path to the benchmark library> -O3 -std=c++14 -gdwarf-2 -fno-rtti -Wall -pedantic -lbenchmark -pthread
Powodem dlaczego nie używam -fno-omit-frame-pointer
jest to, że używam opcji -gdwarf-2
, która pozostawia informacje o debugowaniu w pliku wykonywalnym karłów, co jest alternatywą dla pozostawienia wskaźnika ramki w tym przypadku. Oznacza to również, że przekazuję --call-graph "dwarf"
do perf record
. W każdym razie spróbowałem również metody wskaźnika ramki i daje takie same wyniki, więc to nie ma znaczenia.
Dlaczego więc nie perfekcyjnie "cofnąć" mylenie nazwy C++ w tym przypadku? Czy ma to coś wspólnego z używaniem GCC, co oczywiście oznacza, że używam libstdC++?
Używam Arch Linux a 'perf report' pokazuje poprawną zmianę symbolu. Strona podręcznika perf również pokazuje opcję '--demangle', która jest domyślnie włączona. Ponieważ nie widzę takiego zachowania jak ty, nie mam odpowiedzi, ale to, co widzisz, nie jest domyślnym zachowaniem. –
Próbowałem dodać również ten przełącznik ręcznie, ale nic to nie zmieniło – adam10603
@GabrielSouthern Czy używasz również gcc? – adam10603