Я хотел бы измерить стек, кучу и статическую память отдельно, потому что у меня есть некоторые ограничения для каждого из них.
Для измерения кучи памяти я использую инструмент valgrind-> massif.
Массив также должен быть в состоянии измерить кучу и память стека, но он показывает странные результаты:
Последний снимок без —stacks = yes обеспечивает общее (B) = 0, полезную кучу (B) = 0, дополнительную кучу (B) = 0 (так что все в порядке)
Последний снимок с параметром —stacks = yes обеспечивает общее (B) = 2256, полезную кучу (B) = 1,040, дополнительную кучу (B) = 0, стеки (B) = 1,208 (что показывает утечку памяти, даже если это та же команда и тот же бинарный тест … не знаю почему …)
Итак, наконец, мне нужен инструмент для измерения стека и статической памяти, используемой двоичным файлом с ++, некоторая помощь будет приветствоваться 🙂
Спасибо за вашу помощь !
———— РЕДАКТИРОВАТЬ —————
В дополнение к комментарию Basile Starynkevitch, чтобы объяснить, что я имею в виду со статической, стековой и кучной памятью, я взял это из документации библиотеки Dmalloc:
Статические данные — это информация, пространство хранения которой компилируется в программу.
/* global variables are allocated as static data */
int numbers[10];
main()
{
…
}
Данные стека — это данные, выделяемые во время выполнения для хранения информации, используемой внутри функций. Эти данные управляются системой в пространстве, называемом пространством стека.
void foo()
{
/* if they are, the parameters of the function are stored in the stack */
/* this local variable is stored on the stack */
float total;
…
}
main()
{
foo();
}
Данные кучи также выделяются во время выполнения и предоставляют программисту возможности динамической памяти.
main()
{
/* the address is stored on the stack */
char * string;
…
/*
* Allocate a string of 10 bytes on the heap. Store the
* address in string which is on the stack.
*/
string = (char *)malloc(10);
…
/* de-allocate the heap memory now that we're done with it */
(void)free(string);
…
}
Я хотел бы измерить стек, кучу и статическую память отдельно, потому что у меня есть некоторые ограничения для каждого из них.
Я не могу себе представить, почему у вас есть отдельный ограничения для каждого. Они все сидят в виртуальная память! Кстати, вы могли бы использовать setrlimit (2) установить ограничения (возможно, из вызывающего процесса оболочки, например, с помощью bash ulimit
встроено в него).
Ваши определения наивны, если вы считаете фактическим виртуальное адресное пространство вашего процесса.
КСТАТИ, Proc (5) позволяет вам запросить это пространство, например, с помощью /proc/self/maps
лайк Вот из вашей программы (или /proc/1234/maps
запросить процесс pid 1234, возможно, из терминала). Вы также можете использовать /proc/self/status
а также /proc/self/statm
(Кстати, попробуйте cat /proc/self/maps
а также cat /proc/$$/maps
в терминале). В Linux вы также можете использовать mallinfo (3) а также malloc_stats (3) получить информацию о статистике выделения памяти.
Статические данные могут быть в сегмент данных (или же BSS сегмент) вашей программы. Но как насчет локального пространства потока? И эти сегменты данных также содержат данные, внутренние для различных библиотек, в частности, стандартной библиотеки C libc.so
(это считается?). Конечно, сегмент стека часто больше (так как страница выровнена), чем фактический используемый стек (снизу вверх) %esp
регистр). И мультинарезной процесс имеет несколько стеки (и сегменты стека), по одному на поток.
Данные стека, конечно, находятся в стеке вызовов, который содержит много других вещей (адреса возврата, пробел, разлитые регистры), а не просто автоматические переменные (некоторые из них находятся только в регистрах или оптимизируются компилятором, не занимая слот стека). Они считают? Кроме того, код запуска от crt0 (который называет ваш main
), вероятно, будет использовать немного стекового пространства (это считается?) …
Данные, выделенные из кучи (они могут быть выделены из различных библиотек или даже из динамического компоновщика), содержат не только то, что получает ваша программа malloc
(и друзья) но и необходимые накладные расходы. Это считается? И что насчет отображенные в память файлы? Как они должны рассчитывать?
Я бы порекомендовал запросить фактическое виртуальное адресное пространство (например, прочитав /proc/self/maps
или используя ртар (1)…) но они у тебя получаются чем то отличным от того что ты просишь.
Просто, кстати, я нашел это перед вашим ответом:
Для измерения кучи памяти используйте valgrind -> массив
Для измерения статической памяти используйте функцию bash size
на двоичном
Для измерения стека можно использовать stackusage
Это дало мне всю статистику, которую я хотел