LINUX.ORG.RU

Как узнать, на что в Си++-программе расходуется память?


0

2

Явный malloc в программе - только один, выполняется один раз. Утечек памяти нет. Но ps aux показывает, что программа занимает в памяти 29 Мбайт:

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
....
pacify    6100  0.0  0.7 113924 29180 pts/1    S+   19:47   0:00 ./prog input.jpg

Как узнать - на что расходуется память?
Сколько уходит под кучу, сколько - под стек, сколько - под код.
Бинарник программы занимает 7 килобайт, тянет за собой OpenGL, Freetype, SQLite3, FreeImage (небольшая программа для обработки изображений).

★★★★★

Ответ на: комментарий от LongLiveUbuntu

хм-хм ... valgrind выдал странную вещь:

--6196-- REDIR: 0x4816230 (strlen) redirected to 0x380408a7 (vgPlain_amd64_linux_REDIR_FOR_strlen)
Inconsistency detected by ld.so: rtld.c: 1247: dl_main: Assertion `_rtld_local._dl_rtld_map.l_libname' failed!

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Это было по причине сжатия бинарника архиватором upx.

В общем, valgrind обнаружил утечки ... (но утечки происходят только при старте программы, далее объем используемой памяти не изменяется)
Общий объем памяти, выделенной под кучу, оказался порядка 40 Мбайт ... непонятно - какая библиотека делает такое зло.

$ valgrind -v --leak-check=full ./prog input.jpg
....
total heap usage: 3,217 allocs, 2,728 frees, 40,318,453 bytes allocated

pacify ★★★★★
() автор топика

> тянет за собой OpenGL, Freetype, SQLite3, FreeImage (небольшая программа для обработки изображений).

Вот тебе и ответ. Скорее всего твой фриимадж и выделяет память.

tensai_cirno ★★★★★
()
Ответ на: комментарий от tensai_cirno

> Скорее всего твой фриимадж и выделяет память.

А как узнать, какая библиотека сколько выделяет? Чтобы быть уверенным, что это именно по причине FreeImage.

Хотя, в принципе, можно отключить FreeImage, и посмотреть - как изменится потребление памяти ...

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

> Хотя, в принципе, можно отключить FreeImage, и посмотреть - как изменится потребление памяти ...


Проблема решена. 22 Мбайта жрёт OpenGL.

Это я понял, просто запустив OpenGL-демку.

P.S. О времена! О нравы!

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

pacify

Проблема решена. 22 Мбайта жрёт OpenGL.


Это разве много?

drull ★☆☆☆
()
Ответ на: комментарий от yoghurt

> Так демка жрёт, или OpenGL?

OpenGL-демка. Там ничего особенного нет, просто несколько тысяч голых кубиков (без текстур) крутятся.

pacify ★★★★★
() автор топика
Ответ на: комментарий от DELIRIUM

> И ещё ВОТ

Спасибо тебе, добрый человек.

Теперь стало ясно - кто именно кушает память.

pacify ★★★★★
() автор топика

еще можно strace заюзать и проанализировать вызовы mmap

Harald ★★★★★
()

Для полноты картины еще посоветую google perftools. Круты тем, что можно брать снапшоты heap'а и как бы вычитать друг из друга. Например, сделал снапшот, выполнил в програме действие, сделал еще снапшот, и смотришь на картинке, что и где навыдела программа в процесе действия между снапшотами.

ratatosk
()

Начинаем отсюда: /proc/12345/maps

Deleted
()
Ответ на: комментарий от pacify

ты непонял - 22 метра весит opengl32.so :)
сами либа стока весит

anonymous
()

Открой для себя google-perftools. Там есть профилировщик кучи, который действительно показывает, какие функции сколько памяти выделили.

iliyap ★★★★★
()

Пишите на python и не морочьте себе голову всякой ерундой.

Lynyrd
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.