как найти выделенную память в Linux - PullRequest
3 голосов
/ 11 августа 2009

Добрый день всем,

Что я пытаюсь сделать : Я хотел бы реализовать расширение для модульного теста C ++, чтобы определить, выделяет ли тест память и не освобождает ли ее. Моя идея состояла в том, чтобы записать уровни выделения или уровни свободной памяти до и после теста. Если они не совпадают, значит, у вас утечка памяти.

Что я пробовал до сих пор: Я написал подпрограмму для чтения / proc / self / stat , чтобы получить размер виртуальной машины и размер резидентного набора. Размер резидентного набора, кажется, то, что мне нужно, но это явно не правильно. Он изменяется между последовательными вызовами функции без выделения памяти. Я считаю, что он возвращает кешированную память, а не то, что выделено. Он также изменяется с шагом 4 тыс., Поэтому он слишком грубый, чтобы его можно было реально использовать.

Я могу получить размер стека, выделив локальный и сохранив его адрес. Есть ли проблемы с этим?

Есть ли способ получить реальную свободную или выделенную память в Linux?

Спасибо

Ответы [ 5 ]

4 голосов
/ 11 августа 2009

Лучше всего на самом деле использовать инструмент, специально разработанный для поиска утечек памяти. У меня есть личный опыт работы с Electric Fence , который прост в использовании и, кажется, хорошо справляется со своей задачей (не уверен, насколько хорошо он будет работать с C ++). Также рекомендуется другими лицами: Dmalloc .

Конечно, всем, похоже, нравится Valgrind , который может делать практически все и даже имеет внешние интерфейсы (хотя все, для чего создан встроенный внешний интерфейс, означает, что это, вероятно, не самая простая вещь в мире). Если люди KDE могут порекомендовать его, он должен быть в состоянии справиться практически со всем. (Я не говорю ничего плохого о KDE, просто это очень большая кодовая база C ++, поэтому, если Valgrind может работать с программным обеспечением KDE, у него должно быть что-то для этого. Хотя у меня нет личного опыта с этим, как Electric Fence мне всегда было достаточно)

3 голосов
/ 11 августа 2009

Я должен согласиться с теми, кто предлагает Valgrind и тому подобное, но если накладные расходы слишком велики, одним из вариантов может быть использование вызова mallinfo () для получения статистики по выделенной в данный момент памяти и проверьте, является ли uordblks ненулевым.

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

2 голосов
/ 11 августа 2009

не ищите ОС, чтобы получить информацию о распределении. библиотека C управляет внутренней памятью и запрашивает у OS больше оперативной памяти порциями (в вашем случае 4KB) В большинстве случаев он никогда не выпускается для возврата в ОС, поэтому вы ничего не можете там проверить.

Вам нужно будет пропатчить malloc() и free(), чтобы получить необходимую информацию.

Или используйте Valgrind.

0 голосов
/ 12 октября 2009

google-perftools может использоваться в вашем тестовом коде.

0 голосов
/ 11 августа 2009

Не прямой ответ, но вы можете переопределить операторы :: new и :: delete, а внутри либо с помощью одноэлементных или глобальных объектов, отслеживать выделенную и выделенную память.

Редактировать: Если это личный проект, сделай сам, тогда круто. Но если для чего-то важного вы всегда можете перейти на одну из множества доступных библиотек / программ обнаружения утечек, быстрого поиска в Google должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...