LINUX.ORG.RU

valgrind


0

0

Хочу узнать смысл значений в конце лога valgrind.
==5287== HEAP SUMMARY:
==5287== in use at exit: 48,546,838 bytes in 132,570 blocks
==5287== total heap usage: 7,014,367 allocs, 6,881,797 frees, 1,721,217,567 bytes allocated
==5287== LEAK SUMMARY:
==5287== definitely lost: 39,402 bytes in 336 blocks
==5287== indirectly lost: 884,343 bytes in 9,761 blocks
==5287== possibly lost: 38,375,145 bytes in 76,950 blocks
==5287== still reachable: 9,247,948 bytes in 45,523 blocks
==5287== suppressed: 0 bytes in 0 blocks
==5287== Rerun with --leak-check=full to see details of leaked memory
==5287== ERROR SUMMARY: 51866 errors from 22 contexts (suppressed: 301 from 14)

==5287== in use at exit: 48,546,838 bytes in 132,570 blocks - как переводится понятно, но как понять использовано на выходе, по хорошему должно быть 0?
==5287== total heap usage: 7,014,367 allocs, 6,881,797 frees, 1,721,217,567 bytes allocated - аналогично

definitely lost - собственно потерянная память.
indirectly lost - ?
possibly lost: - возможно память утекла, а возможно и нет, вобще тоже не очень понимаю
still reachable - нашел такое описание: Still reachable обычно означает, что valgrind нашел указатель на начало не освобожденного блока памяти, что во многих случаях связано с выделением глобальных переменных и т.п. вещей, я так понимаю на этот показатель особого внимания не обращать?
suppressed - не знаю, но раз по нулям значит хорош.
ERROR SUMMARY: 51866 errors from 22 contexts (suppressed: 301 from 14) - всего ошибок, а много это или мало не знаю


> ERROR SUMMARY: 51866 errors from 22 contexts (suppressed: 301 from 14) - всего ошибок, а много это или мало не знаю

Должно быть 0.

--

К.О.

anonymous ()

==5287== in use at exit: 48,546,838 bytes in 132,570 blocks - как переводится понятно, но как понять использовано на выходе, по хорошему должно быть 0?

значит, что столько памяти «утекло». То бишь всё ещё неосвобождено на момент выхода. Должно быть 0.

rha ()

==5287== in use at exit: 48,546,838 bytes in 132,570 blocks - как переводится понятно, но как понять использовано на выходе, по хорошему должно быть 0?

нет, ноль не должно быть. Фактически эта строка - статистика.

definitely lost - собственно потерянная память.

определённо потерянная. Это, например, когда ты выделил память на куче в функции и не передал никому указатель. Как только функция выполнилась - указатель потерялся и память определённо утекла.

indirectly lost -

это непрямые утечки. Как правило, на это можно забить

possibly lost: - возможно память утекла, а возможно и нет, вобще тоже не очень понимаю

да, в этом месте valgrind тоже не понял, утекло или нет, но поведение ему показалось подозрительным.

still reachable

это неутёкшая память. Если её нужно будет освободить - ты можешь это сделать.

suppressed - не знаю, но раз по нулям значит хорош.

ошибаешься. suppressed - это количество ошибок, сообщения о которых он тебе не стал показывать. Причина кроется в том, что это могут ошибки, которые ты не можешь исправить, например, в glibc, чтобы они не захламляли лог - составляется файл *.supp, в котором описано, сообщения о каких ошибках выводить не надо. То, что по нулям - ничего не значит, как и не нулевое число.

ERROR SUMMARY: 51866 errors from 22 contexts (suppressed: 301 from 14) - всего ошибок, а много это или мало не знаю

должно быть 0. Если есть не твои ошибки - нужно сделать, чтобы они были в suppressed. А здесь должно быть ноль.

Ну и вообще, вся эта статистика - это статистика. Важная информация в valgrind выглядит так:

==1315== 544 bytes in 2 blocks are definitely lost in loss record 172 of 273
==1315==    at 0x400494E: calloc (vg_replace_malloc.c:397)
==1315==    by 0x8195AA4: child_start (child.c:1496)
==1315==    by 0x8062471: spawn_child (main.c:1431)
name_no ★★ ()
Ответ на: комментарий от rha

>> неправда. Это далеко не всегда утёкшая память.

вот здесь поподробнее, пожалуйста

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

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

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

> значит, что столько памяти «утекло». То бишь всё ещё неосвобождено на момент выхода. Должно быть 0.

Кому «должно»? Это живая, не утекшая память. Всё в порядке. Эта строка — просто статистика.

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

kemm ()
Ответ на: комментарий от name_no

> это непрямые утечки. Как правило, на это можно забить

Скорее, не забить, просто при исправлении directly они сами автоматом уйдут (или перейдут в категорию definitely). Насколько я помню, это участки, на которые есть ссылки только из «definitely lost» блоков.

kemm ()

> ERROR SUMMARY: 51866 errors from 22 contexts (suppressed: 301 from 14)

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

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