Как профилировать программу C в Linux с помощью GNU gprof
Производительность — одна из самых больших проблем, с которыми сталкиваются программисты при разработке программного обеспечения. Именно по этой причине профилирование кода является одним из наиболее важных аспектов разработки программного обеспечения, поскольку оно позволяет выявлять узкие места, мертвый код и даже ошибки. Если вы программист, разрабатывающий приложения для Linux, вам стоит обратить внимание на профилировщик GNU «gprof».
Загрузить и установить
Gprof предустановлен в большинстве дистрибутивов Linux, но если в вашем дистрибутиве Linux это не так, вы можете загрузить и установить его с помощью менеджера пакетов командной строки, например apt-get
или 10. Например, выполните следующую команду, чтобы загрузить и установить gprof в системах на базе Debian:
Contents
Загрузить и установить
apt-get install binutils
Требования
Прежде чем использовать gprof для создания данных профилирования, убедитесь, что исполняемый файл вашей программы содержит дополнительную информацию, необходимую профилировщику для правильной работы. Этого можно добиться, добавив параметр командной строки -pg
при компиляции кода, предполагая, что вы используете компилятор gcc
. Если вы используете отдельные команды для компиляции и компоновки, добавьте параметр командной строки к обеим командам.
Использование gprof
В качестве примера рассмотрим следующую программу на языке C:
#include <stdio.h>
void func2()
{
inТребования
n>= 0;
for(count=0; count
As described in the previous section, compile the code with the -pg option:
<pre class="bash">gcc -Wall -pg test.c -o test
После компиляции запустите программу:
После успешного выполнения программа создаст файл с именем «gmon.out», содержащий информацию о профилировании, но в необработанном виде, что означает, что вы не можете открыть файл и напрямую прочитать информацию. Чтобы создать удобочитаемый файл, выполните следующую команду:
gprof test gmonИспользование gprof
output
Эта команда записывает всю информацию о профилировании в удобочитаемом формате в файл «prof_output». Обратите внимание, что вы можете изменить имя выходного файла по своему усмотрению.
Плоский профиль и график звонков
Если вы откроете файл, содержащий данные профилирования, вы увидите, что информация разделена на две части: плоский профиль и график вызовов. Первый содержит такие сведения, как количество вызовов функций, общее время выполнения функции и т. д., второй описывает дерево вызовов программы, предоставляя подробную информацию о родительских и дочерних функциях конкретной функции.
Например, в нашем случае это плоский профиль:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
100.00 0.94 0.94 256 3.67 3.67 func2
0.00 0.94 0.00 1 0.00 936.33 func1
Ниже приведен график вызовов:
index % time self children called name
0.00 0.00 1/256 main [2]
0.94 0.00 255/256 func1 [3]
[1] 100.0 0.94 0.00 256 fПлоский профиль и график звонков
/span>
-----------------------------------------------
[2] 100.0 0.00 0.94 main [2]
0.00 0.94 1/1 func1 [3]
0.00 0.00 1/256 func2 [1]
-----------------------------------------------
0.00 0.94 1/1 main [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()
, либо аварийно завершает работу из-за необработанного сигнала.
- Файл «gmon.out» всегда создается в текущем рабочем каталоге. Итак, убедитесь, что ваша программа имеет достаточные права для создания файла в текущем каталоге.
- Внешний инструмент под названием gprof2dot можно использовать для преобразования графа вызовов из gprof в графическую форму.
- Используя gprof, вы также можете создать аннотированный список исходного кода, который дает представление о том, сколько раз выполнялась каждая строка программы. Чтобы получить эту информацию, скомпилируйте программу с
-g
(вместе с опцией -pg
, описанной ранее) и запустите команду gprof
с -A
параметр командной строки.
Некоторые важные моменты