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

НАИМЕНОВАНИЕ

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

ОБЗОР

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

ОПИСАНИЕ

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

ПАРАМЕТРЫ

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

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

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

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

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

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

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

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

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

СТАНДАРТЫ

       GNU.

ПРИМЕРЫ

       В  следующем примере показано использование 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
           Flat 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> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                                        sprof(1)