Valgrind не обнаруживает утечек памяти. Насколько это безопасно? - PullRequest
5 голосов
/ 11 октября 2011

Я пропустил свой код через valgrind со следующими результатами:

== 4492 == Memcheck, детектор ошибок памяти
== 4492 == Copyright (C) 2002-2009 и GNU GPL'd, Джулиан Сьюард и др.
== 4492 == Использование Valgrind-3.5.0 и LibVEX;повторно введите -h для получения информации об авторских правах
== 4492 == Команда: ./mem
== 4492 == PID родителей: 4455
== 4492 ==
== 4492 ==
== 4492 == РЕЗЮМЕ HEAP:
== 4492 == используется на выходе: 0 байтов в 0 блоках
== 4492 == общее использование кучи: 19 595 342 выделения, 19 595 342 освобождения, 27 194 272 байта выделено ==4492 ==
== 4492 == Все блоки кучи были освобождены - утечки невозможны
== 4492 ==
== 4492 == Для подсчета обнаруженных и подавленных ошибок перезапустите с: -v
== 4492 == РЕЗЮМЕ ОШИБКИ: 0 ошибок из 0 контекстов (исключено: 4 из 4)

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

Я запускаю valgrind, используя:

valgrind --track-origins=yes --leak-check=yes
    --tool=memcheck --read-var-info=yes --log-file=error.txt`

, и я компилирую программу, используя теги -g и -march=core2.

Ответы [ 4 ]

8 голосов
/ 11 октября 2011

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

Последний не может быть обнаружен valgrind, так как valgrind не знает, что вы больше не хотите его использовать.

Чтобы получить некоторую статистику об использовании памяти вашими программами, вы можете использовать инструмент массива valgrind, который более детально покажет вам, как распределяется ваша память. Это может быть полезно при поиске свиней в памяти.

4 голосов
/ 11 октября 2011

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

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

Я бы также посмотрел на эти две последние строки:

==4492== For counts of detected and suppressed errors, rerun with: -v
==4492== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4) 

Возможно, вы захотите запустить его с -v, просто чтобы проверить, что это за подавление. Они могут быть ничем, но смотреть на это не повредит.

0 голосов
/ 11 октября 2011

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

Тем не менее, я бы не стал доверять вашему механизму для определения вашего процесса.использование памяти, либо.За кулисами происходит многое: кеширование, например.

Я бы назвал это "неокончательным".

0 голосов
/ 11 октября 2011

Видите ли вы увеличение использования памяти с таким инструментом, как top? В зависимости от поведения вашей программы, если вы постоянно выделяете и освобождаете память, вы можете ввести фрагментацию, которая приведет к увеличению адресного пространства. Если вы дадите процессу работать достаточно долго, он может стабилизироваться и перестать расти.

...