Provided by: manpages-ru_4.18.1-1_all bug

ИМЯ

       sprof - читает и показывает общие объекты данных профилирования

СИНТАКСИС

       sprof [параметр]… shared-object-path [profile-data-path]

ОПИСАНИЕ

       Команда   sprof  выводит  краткий  отчёт  по  профилированию  для  общего  объекта  (общей
       библиотеки),  заданного  в  первом  аргументе   командной   строки.   Краткий   отчёт   по
       профилированию  создан  с  помощью  ранее  сгенерированных данных профилирования во втором
       (необязательном) аргументе командной строки. Если путь данных профилирования  отсутствует,
       то  sprof  попытается вычислить его используя soname общего объекта и поищет файл с именем
       <soname>.profile в текущем каталоге.

ПАРАМЕТРЫ

       Следующие параметры командной строки определяют выводимые данные профилирования:

       -c, --call-pairs
              Вывести список пар путей вызова для интерфейсов, экспортируемых общим  объектом,  а
              также сколько раз использовался каждый путь.

       -p, --flat-profile
              Сгенерировать  плоский  профиль  всех  функций  в  отслеживаемом  объекте,  а также
              количество вызовов и время работы.

       -q, --graph
              Сгенерировать граф вызовов.

       Если ни один из этих параметров не  указан,  то  действием  по  умолчанию  является  вывод
       плоского профиля и графа вызовов.

       Доступны следующие дополнительные параметры командной строки:

       -?, --help
              Показать справку по параметрам командной строки и аргументам и завершить работу.

       --usage
              Показать короткое сообщение об использовании и завершить работу.

       -V, --version
              Вывести версию программы и выйти.

СТАНДАРТЫ

       Команда sprof является расширением GNU и отсутствует в POSIX.1.

ПРИМЕРЫ

       В  следующем  примере  показано использование sprof. Пример состоит из основной программы,
       которая вызывает две функции из общего объекта. Вот код основной программы:

           $ cat prog.c
           #include <stdlib.h>

           void x1(void);
           void x2(void);

           int
           main(int argc, char *argv[])
           {
               x1();
               x2();
               exit(EXIT_SUCCESS);
           }

       Функции x1() и x2() определены в следующем файле исходного кода, который используется  для
       сборки общего объекта:

           $ cat libdemo.c
           #include <unistd.h>

           void
           consumeCpu1(int lim)
           {
               for (unsigned int j = 0; j < lim; j++)
                getppid();
           }

           void
           x1(void) {
               for (unsigned int j = 0; j < 100; j++)
                consumeCpu1(200000);
           }

           void
           consumeCpu2(int lim)
           {
               for (unsigned int j = 0; j < lim; j++)
                getppid();
           }

           void
           x2(void)
           {
               for (unsigned int j = 0; j < 1000; j++)
                consumeCpu2(10000);
           }

       Соберём общий объект с реальным именем libdemo.so.1.0.1 и soname libdemo.so.1:

           $ cc -g -fPIC -shared -Wl,-soname,libdemo.so.1 \
                   -o libdemo.so.1.0.1 libdemo.c

       Создадим символьные ссылки на soname библиотеки и имя библиотеки для компоновщика:

           $ ln -sf libdemo.so.1.0.1 libdemo.so.1
           $ ln -sf libdemo.so.1 libdemo.so

       Скомпилируем  основную  программу,  скомпонуем  её  с  общим  объектом  и  выведем  список
       динамических зависимостей программы:

           $ cc -g -o prog prog.c -L. -ldemo
           $ ldd prog
                linux-vdso.so.1 =>  (0x00007fff86d66000)
                libdemo.so.1 => not found
                libc.so.6 => /lib64/libc.so.6 (0x00007fd4dc138000)
                /lib64/ld-linux-x86-64.so.2 (0x00007fd4dc51f000)

       Чтобы  получить  информацию  о  профилировании  общего  объекта  мы  определим  переменную
       окружения LD_PROFILE с soname библиотеки:

           $ export LD_PROFILE=libdemo.so.1

       Затем  определим  переменную  окружения  LD_PROFILE_OUTPUT  с  именем  каталога куда нужно
       сохранить результат профилирования и создадим этот каталог, если его ещё нет:

           $ export LD_PROFILE_OUTPUT=$(pwd)/prof_data
           $ mkdir -p $LD_PROFILE_OUTPUT

       Переменная LD_PROFILE приводит к добавлению результата  профилирования  в  выходной  файл,
       если  он  уже  существует,  поэтому  убедимся,  что  не  существует каких-либо результатов
       профилирования:

           $ rm -f $LD_PROFILE_OUTPUT/$LD_PROFILE.profile

       Затем запустим программу для получения результата профилирования, которые  записывается  в
       файл в каталоге, указанном в LD_PROFILE_OUTPUT:

           $ LD_LIBRARY_PATH=. ./prog
           $ ls prof_data
           libdemo.so.1.profile

       Используем параметр sprof -p для генерации плоского профиля с счётчиками и временем:

           $ sprof -p libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile
           Плоский профиль:

           Each sample counts as 0.01 seconds.
             %   cumulative   self              self     total
            time   seconds   seconds    calls  us/call  us/call  name
            60.00      0.06     0.06      100   600.00           consumeCpu1
            40.00      0.10     0.04     1000    40.00           consumeCpu2
             0.00      0.10     0.00        1     0.00           x1
             0.00      0.10     0.00        1     0.00           x2

       Параметр sprof -q генерирует граф вызовов:

           $ sprof -q libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile

           index % time    self  children    called     name

                           0.00    0.00      100/100         x1 [1]
           [0]    100.0    0.00    0.00      100         consumeCpu1 [0]
           -----------------------------------------------
                           0.00    0.00        1/1           <UNKNOWN>
           [1]      0.0    0.00    0.00        1         x1 [1]
                           0.00    0.00      100/100         consumeCpu1 [0]
           -----------------------------------------------
                           0.00    0.00     1000/1000        x2 [3]
           [2]      0.0    0.00    0.00     1000         consumeCpu2 [2]
           -----------------------------------------------
                           0.00    0.00        1/1           <UNKNOWN>
           [3]      0.0    0.00    0.00        1         x2 [3]
                           0.00    0.00     1000/1000        consumeCpu2 [2]
           -----------------------------------------------

       Выше  и ниже строки «<UNKNOWN>» представляют идентификаторы, которые находятся вне объекта
       профилирования (в этом примере они являются экземплярами main()).

       Параметр sprof -c генерирует список пар вызовов и количество их появления:

           $ sprof -c libdemo.so.1 $LD_PROFILE_OUTPUT/libdemo.so.1.profile
           <UNKNOWN>                  x1                                 1
           x1                         consumeCpu1                      100
           <UNKNOWN>                  x2                                 1
           x2                         consumeCpu2                     1000

СМ. ТАКЖЕ

       gprof(1), ldd(1), ld.so(8)

ПЕРЕВОД

       Русский   перевод   этой   страницы   руководства    был    сделан    Alexander    Golubev
       <fatzer2@gmail.com>,   Azamat   Hackimov  <azamat.hackimov@gmail.com>,  Hotellook,  Nikita
       <zxcvbnm3230@mail.ru>,       Spiros       Georgaras       <sng@hellug.gr>,       Vladislav
       <ivladislavefimov@gmail.com>,    Yuri    Kozlov   <yuray@komyakino.ru>   и   Иван   Павлов
       <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.