Hur profilerar du ett C-program i Linux med GNU gprof
Prestanda är en av de största utmaningar som programmerare står inför när man utvecklar programvara. Det är anledningen till att kodprofilering är en av de viktigaste aspekterna av mjukvaruutveckling, eftersom det låter dig identifiera flaskhalsar, dödkod och till och med buggar. Om du är en programmerare som utvecklar program för Linux, är GNU profiler "gprof" det verktyg som du ska se efter.
Ladda ner och installera
Gprof kommer förinstallerad med de flesta Linux-distributioner, men om det inte är fallet med din Linux distro kan du ladda ner och installera det via en kommandoradspaketchef som apt-get
eller yum
. Till exempel kör följande kommando för att hämta och installera gprof på Debian-baserade system:
sudo apt-get install binutils
Krav
Innan du använder gprof för att generera profildata, kontrollera att ditt program körbar innehåller extra information som krävs av profiler för att fungera korrekt. Detta kan uppnås genom att lägga till -pg
kommandoradsalternativet medan du sammanställer din kod, förutsatt att du använder gcc
kompilatorn. Om du använder separata kommandon för sammanställning och länkning lägger du till kommandoradsalternativet för båda kommandona.
Använda gprof
Tänk på följande C-program som ett exempel:
#include void func2 () {int count = 0; för (count = 0; count <0XFFFFF; count ++); lämna tillbaka; } void func1 (void) {int count = 0; för (count = 0; count <0XFF; count ++) func2 (); lämna tillbaka; } int main (void) {printf ("\ n Hej världen! \ n"); FUNC1 (); func2 (); returnera 0; }
Som beskrivet i föregående avsnitt, kompilera koden med -pg
alternativet:
gcc -Wall -pg test.c -o test
När du har sammanställt kör programmet:
./testa
Efter lyckad körning kommer programmet att skapa en fil med namnet "gmon.out" som innehåller profilinformationen, men i en rå form, vilket innebär att du inte kan öppna filen och direkt läsa informationen. För att generera en mänskligt läsbar fil, kör följande kommando:
gprof test gmon.out> prof_output
Detta kommando skriver all profilinformation i läsbart format till "prof_output" -filen. Observera att du kan ändra utdatafilnamnet enligt din bekvämlighet.
Plattprofil och samtalsdiagram
Om du öppnar filen som innehåller profileringsdata ser du att informationen är indelad i två delar: Flatprofil och samtalsdiagram. Medan den förstnämnda innehåller detaljer som funktionskalltal, den totala körtiden som används i en funktion, och mer beskriver sistnämnda programmets samtalstree, vilket ger detaljer om föräldra- och barnfunktionerna för en viss funktion.
Till exempel är följande Flatprofilen i vårt fall:
Varje prov räknas som 0, 01 sekunder. % kumulativ jag själv totalt antal sekunder sekunder samtal ms / samtal ms / samtal namn 100, 00 0, 94 0, 94 256 3, 67 3, 67 func2 0, 00 0, 94 0, 00 1 0, 00 936, 33 func1
Nedan är samtalskurvan:
index% själv självbarn heter namn 0.00 0.00 1/256 huvud [2] 0.94 0.00 255/256 func1 [3] [1] 100, 0 0, 94 0, 00 256 func2 [1] -------------- --------------------------------- [2] 100.0 0.00 0.94 main [2] 0.00 0.94 1/1 func1 [ 3] 0, 00 1/2 1/256 func2 [1] --------------------------------------- -------- 0, 00 0, 94 1/1 huvud [2] [3] 99, 6 0, 00 0, 94 1 func1 [3] 0, 94 0, 00 255/256 func2 [1] ------------- ----------------------------------
Observera att den detaljerade förklaringen av dessa fält finns i filen som innehåller profileringsinformation (prof_output i detta fall) och genereras varje gång profiler körs. För att stänga av detaljerna, använd kommandoraden -b
med gprof
kommandot.
Några viktiga punkter
- För att skriva filen
gmon.out
korrekt måste ditt program avslutas normalt. Filen produceras inte när programmet antingen avslutas genom att anropa_exit()
-funktionen eller slutar abnormt på grund av en obehandlad signal. - Filen "gmon.out" skapas alltid i den aktuella arbetsmappen. Se till att ditt program har tillräckliga rättigheter för att skapa en fil i den aktuella katalogen.
- Ett externt verktyg med namnet gprof2dot kan användas för att konvertera samtalsgrafen från gprof till grafisk form.
- Med hjälp av gprof kan du också skapa en antecknad källlista som ger en uppfattning om hur många gånger varje rad av programmet utfördes. För att producera denna information, kompilera programmet med
-g
(tillsammans med-pg
alternativet som förklaras tidigare) och kör kommandotgprof
med-A
kommandoradsalternativet.