Jak działa flaga gcc-pg?

Próbuję zrozumieć, jak działa znacznik -pg (LUB -p) podczas kompilacji kodu C z gcc.

Oficjalna dokumentacja gcc stwierdza tylko :

-pg
Wygeneruj dodatkowy kod do zapisu informacji o Profilu odpowiednich dla programu analitycznego gprof. Musisz użyć tej opcji podczas kompilacji plików źródłowych, o których chcesz DANE, a także musisz jej użyć podczas łączenia.

To naprawdę mnie interesuje, ponieważ robię mały badania nad profilerami-próba wybrania najlepszego narzędzia do pracy.

Author: user835611, 2011-09-02

3 answers

Kompilowanie za pomocą -pg instrumentów Twojego kodu tak, aby gprof przekazywał szczegółowe informacje, patrz Instrukcja gprof, 9.1 implementacja profilowania

Profilowanie działa poprzez zmianę sposobu kompilacji każdej funkcji w twoim programie, tak aby kiedy zostanie wywołana, ukryła pewne informacje o tym, skąd została wywołana. Na tej podstawie profiler może dowiedzieć się, jaka funkcja go wywołała i policzyć, ile razy została wywołana. Tej zmiany dokonuje kompilator, gdy Twój program jest kompilowany z opcją -pg, która powoduje, że każda funkcja wywołuje mcount (lub _mcount lub __mcount, w zależności od systemu operacyjnego i kompilatora) jako jedną z pierwszych operacji.

Procedura mcount, zawarta w bibliotece profilowania, jest odpowiedzialna za rejestrowanie w tabeli Wykresów wywołań w pamięci zarówno jej procedury macierzystej (dziecka), jak i rodzica rodzica. Zazwyczaj odbywa się to poprzez zbadanie ramki stosu, aby znaleźć zarówno adres dziecka, jak i adres zwrotny w oryginale rodzic. Ponieważ jest to operacja bardzo zależna od maszyny, mcount sama w sobie jest zazwyczaj krótką procedurą wstępną języka asemblacji, która wyodrębnia wymagane informacje, a następnie wywołuje __mcount_internal (normalną funkcję C) z dwoma argumentami-frompc i selfpc. __mcount_internal jest odpowiedzialny za utrzymanie wykresu wywołania w pamięci, który rejestruje frompc, selfpc, i liczba razy każdy z tych łuków połączeń był przemierzany.

...

Należy pamiętać, że z takim oprzyrządowaniem profiler, jesteś profilowanie tego samego kodu, który skompilowałbyś w wydaniu bez profilowania oprzyrządowania. Istnieje narzut związany z samym kodem oprzyrządowania. Ponadto kod oprzyrządowania może zmieniać użycie instrukcji i pamięci podręcznej danych.

W przeciwieństwie do oprzyrządowania, oprzyrządowanie takie jak Intel VTune działa na kodzie bez oprzyrządowania, patrząc na licznik programu docelowego w regularnych odstępach czasu, używając przerwań systemu operacyjnego. Może również kwerendować specjalne Rejestry PROCESORA, aby dać ci jeszcze lepszy wgląd w to, co się dzieje.

Zobacz także Profilery oprzyrządowanie a próbkowanie

 25
Author: Gregory Pakosz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Ten link zawiera krótkie wyjaśnienie, jak działa gprof.

Ten link daje obszerną krytykę tego. (Sprawdź moją odpowiedź na zarchiwizowane pytanie.)

 9
Author: Mike Dunlavey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:16:51

Z tego źródła: https://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf :

" Oprzyrządowanie występuje w dwóch głównych formularze-jawnie zadeklarowane tracepoints i implicit tracepoints. Wyraźne tracepoints składają się z programisty zdefiniowanego deklaracje określające lokalizację tracepoint, oraz dodatkowe informacje o tym, jakie dane powinny być zbierane w określonym miejscu śledzenia. Implicit tracepoints są umieszczane w kodzie automatycznie przez kompilatora, albo ze względu na flagi kompilatora, albo przez programistę redefinicja powszechnie używanych makr.

Do funkcji instrumentu implicite, gdy jądro jest skonfigurowane do obsługi śledzenia funkcji, kernel build system dodaje -pg do FLAG używanych z kompilator. Powoduje to, że kompilator dodaje kod do prologu każdej funkcji, która wywołuje specjalny zespół rutyna zwana mcount. Ta opcja kompilatora jest specjalnie przeznaczone do wykorzystania do profilowania i śledzenia cele. "

 0
Author: laycat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-23 07:49:14