Как да профилирам програма C в Linux с помощта на GNU gprof
Изпълнението е едно от най-големите предизвикателства, пред които са изправени програмистите, докато разработват софтуер. Ето защо профилирането на кодове е един от най-важните аспекти на разработката на софтуер, тъй като ви позволява да откриете затруднения, мъртъв код и дори бъгове. Ако сте програмист, който разработва софтуерни приложения за Linux, GNU profiler "gprof" е инструментът, с който да се грижите.
Изтегляне и инсталиране
Gprof е предварително инсталиран с повечето Linux дистрибуции, но ако това не е случаят с вашата Linux дистрибуция, можете да го изтеглите и инсталирате чрез пакетен мениджър на командния ред като apt-get
или yum
. Например, изпълнете следната команда, за да изтеглите и инсталирате gprof на базирани на Debian системи:
sudo apt-get инсталирате binutils
Изисквания
Преди да използвате gprof за генериране на профилирани данни, уверете се, че изпълнимият ви програма съдържа допълнителна информация, изисквана от профилар, за да работи правилно. Това може да бъде постигнато чрез добавяне на опцията -pg
командния ред при съставянето на кода, като се приеме, че използвате компилатора gcc
. Ако използвате отделни команди за компилиране и свързване, добавете опцията за команден ред към двете команди.
Използвайки gprof
Помислете за следната програма C като пример:
#include void func2 () {int count = 0; за (брой = 0, брой <0XFFFFF; count ++); се върне; } void func1 (void) {int count = 0; за (брой = 0, брой <0XFF; count ++) func2 (); се върне; } int main (void) {printf ("\ n Здравей свят! \ n"); func1 (); func2 (); връщане 0; }
Както е описано в предишната секция, компилирайте кода с опцията -pg
:
gcc -Wall -pg test.c -o тест
След като се компилирате, изпълнете програмата:
./тест
След успешното изпълнение програмата ще създаде файл с име "gmon.out", който съдържа информация за профилирането, но в суров вид, което означава, че не можете да отворите файла и директно да прочетете информацията. За да генерирате файл с четене от човек, изпълнете следната команда:
gprof тест gmon.out> prof_output
Тази команда записва цялата информация за профилиране в човешки четеем формат в "prof_output" файл. Обърнете внимание, че можете да промените името на изходния файл според вашето удобство.
Плосък профил и графика на повикванията
Ако отворите файла, съдържащ данни за профилиране, ще видите, че информацията е разделена на две части: Плосък профил и Графика на обажданията. Докато първото съдържа подробности като брой на функционалните повиквания, общо време за изпълнение, прекарано в дадена функция и др., Тя описва дървото на повикванията на програмата, като предоставя подробности за родителските и детските функции на определена функция.
Например, в нашия случай е фиксиран профил:
Всяка проба се брои на 0, 01 секунди. % кумулативно самостоятелно общо време секунди секунди повиквания ms / разговор ms / име на повикване 100.00 0.94 0.94 256 3.67 3.67 func2 0.00 0.94 0.00 1 0.00 936.33 func1
По-долу е Графика на обаждането:
индекс% време собствено дете, наречено име 0.00 0.00 1/256 основно [2] 0.94 0.00 255/256 func1 [1] 100.0 0.94 0.00 256 func2 [1] -------------- --------------------------------- [2] 100.0 0.00 0.94 основно [2] 0.00 0.94 1/1 func1 [ 3] 0.00 0.00 1/256 func2 [1] --------------------------------------- ------ 0.00 0.00 0.94 1/1 основно [2] [3] 99.6 0.00 0.94 1 func1 [3] 0.94 0.00 255/256 func2 [1] ------------- ----------------------------------
Обърнете внимание, че подробното обяснение на тези полета присъства във файла, съдържащ информация за профилирането (в този случай prof_output) и се генерира всеки път, когато се изпълнява профилът. За да изключите детайлите, използвайте опцията -b
командния ред с командата gprof
.
Някои важни точки
- За да напишете правилно файла
gmon.out
, програмата трябва да излезе нормално. Файлът не се създава, когато програмата излезе или извика функцията_exit()
или прекрати необичайно поради_exit()
сигнал. - Файлът "gmon.out" винаги се създава в текущата работна директория. Така че, уверете се, че вашата програма има достатъчно привилегии, за да създадете файл в текущата директория.
- Едно външно средство, наречено gprof2dot, може да се използва за преобразуване на графиката на повикванията от gprof в графична форма.
- С помощта на gprof можете също да създадете обява с анотиран източник, който дава представа колко пъти е бил изпълнен всеки ред от програмата. За да създадете тази информация, компилирайте програмата с
-g
(заедно с опцията-pg
обяснена по-рано) и стартирайте командатаgprof
с опцията за командата-A
.