ИМЯ

memusage - исследует использование памяти программы

СИНТАКСИС

memusage [параметры]… программа [параметры_программы]…

ОПИСАНИЕ

Программа memusage представляет собой сценарий bash, который описывает использование памяти программой. Сценарий загружает библиотеку libmemusage.so в окружение вызывающего (через переменную окружения LD_PRELOAD, смотрите ld.so(8)). Библиотека libmemusage.so отслеживает распределение памяти путём перехвата вызовов malloc(3), calloc(3), free(3) и realloc(3); при необходимости, также могут быть перехвачены вызовы mmap(2), mremap(2) и munmap(2).
memusage может выводить собранные данные в текстовом виде, также может использовать memusagestat(1) (смотрите вариант далее) для того, чтобы создать файл PNG, содержащий графическое представление собранных данных.

Сводка использование памяти

Выводимая memusage строка "сводка использование памяти" содержит три поля:
heap total
Сумма аргументов size всех вызовов malloc (3), результат аргументов ( nmemb*size) всех вызовов calloc(3) и сумма аргументов length всех вызовов mmap (2) . В случае realloc (3) и mremap (2), если новый размер блока адресов больше, чем в предыдущий размер, добавляется сумма всех таких различий (новый размер минус старый размер).
heap peak
Максимальное значение всех аргументов size у malloc(3), все произведения nmemb*size у calloc(3), все аргументы size у realloc(3), аргументы length у mmap(2) и аргументы new_size у mremap(2).
stack peak
Перед первым вызовом любой отслеживаемой функции сохраняется адрес указателя стека (базовый указатель стека). После каждого вызова функции читается текущий адрес указателя стека и вычисляет разница с базовым указателем стека. Максимальное значение среди вычитаний является пиком стека.
Сразу за строкой итога в таблице для каждой перехваченной функции показывается количество вызовов, общее количество выделенной и освобождённой памяти и количество вызовов с ошибками. Для realloc(3) и mremap(2) также есть поле «nomove», показывающее переразмещения, у которых изменился адрес блока, и поле «dec», показывающее переразмещения, у которых уменьшился размер блока. Для realloc(3) в дополнительном поле «free» показываются переразмещения, которые были вызваны освобождением блока (т. е., размер переразмещения был равен 0).
Таблица «realloc/total memory», выводимая memusage, не отражает случаи, где realloc(3) используется для переразмещения блока памяти меньшего размера, чем предыдущий. Это может привести к тому, что сумма всех ячеек «total memory» (кроме «free») будет больше, чем ячейка «free/total memory».

Гистограмма размеров блоков

«Гистограмма размеров блоков» выдает разбивку адресованных блоков по размерам.

ПАРАМЕТРЫ

-n имя--progname=имя
Имя файла профилируемой программы.
-p file--png=file
Создать изображение в формате PNG и сохранить его в
-d файл--data=файл
Создать двоичный файл данных и сохранить его в файл.
-u--unbuffered
Не буферизуйте вывод.
-b size--buffer=size
Собрать size записей перед тем, как записать их.
--no-timer
Отключить измерение значения указателя стека на основе таймера ( SIGPROF).
-m--mmap
Также трассировать mmap(2), mremap(2) и munmap(2).
-?--help
Показать справку по использованию и завершить работу.
--usage
Показать короткое сообщение об использовании и завершить работу.
-V--version
Показать информацию о версии и завершить работу.
Следующие параметры применяются только когда используется графический вывод:
-t--time-based
По оси X — время (а не количество вызовов функций).
-T--total
Построить также график общего использования памяти.
--title=название
Использовать название в качестве заголовка графика.
-x size--x-size=size
Рисовать график шириной в size пикселов.
-y size--y-size=size
Рисовать график высотой в size пикселов.

КОД РЕЗУЛЬТАТА

The exit status of memusage is equal to the exit status of the profiled program.

ДЕФЕКТЫ

Сообщения об ошибках доступны по адресу http://www.gnu.org/software/libc/bugs.html

ПРИМЕРЫ

Ниже показана простая программа, которая переразмещает блок памяти в цикле, который достигает пика до того как размер циклически переразмещаемой памяти достигнет нуля. После компиляции программы и запуска следующих команд график использования памяти программой можно найти в файле memusage.png:

$  memusage --data=memusage.dat ./a.out
...
Memory usage summary: heap total: 45200, heap peak: 6440, stack peak: 224
        total calls  total memory  failed calls
 malloc|         1           400             0
realloc|        40         44800             0  (nomove:40, dec:19, free:0)
 calloc|         0             0             0
   free|         1           440
Histogram for block sizes:
  192-207             1   2% ================
...
 2192-2207            1   2% ================
 2240-2255            2   4% =================================
 2832-2847            2   4% =================================
 3440-3455            2   4% =================================
 4032-4047            2   4% =================================
 4640-4655            2   4% =================================
 5232-5247            2   4% =================================
 5840-5855            2   4% =================================
 6432-6447            1   2% ================
$  memusagestat memusage.dat memusage.png

Исходный код программы

#include <stdio.h>
#include <stdlib.h>
#define CYCLES 20
int main(int argc, char *argv[]) { int i, j; size_t size; int *p;
size = sizeof(*p) * 100; printf("malloc: %zu\n", size); p = malloc(size);
for (i = 0; i < CYCLES; i++) { if (i < CYCLES / 2) j = i; else j--;
size = sizeof(*p) * (j * 50 + 110); printf("realloc: %zu\n", size); p = realloc(p, size);
size = sizeof(*p) * ((j + 1) * 150 + 110); printf("realloc: %zu\n", size); p = realloc(p, size); }
free(p); exit(EXIT_SUCCESS); }

СМ. ТАКЖЕ

memusagestat(1), mtrace(1), ld.so(8)

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан aereiae <[email protected]>, Alexey <[email protected]>, Azamat Hackimov <[email protected]>, Dmitriy S. Seregin <[email protected]>, Dmitry Bolkhovskikh <[email protected]>, ITriskTI <[email protected]>, Max Is <[email protected]>, Yuri Kozlov <[email protected]>, Иван Павлов <[email protected]> и Малянов Евгений Викторович <[email protected]>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]

Recommended readings

Pages related to memusage you should read also: