Что значит возможное потерянное в валгринде - PullRequest
6 голосов
/ 21 июля 2011

У меня много возможных потерянных записей от Вальгринда.Что это значит ?Поскольку я использую sqlite, и это хорошо проверено.Я не думаю, что это правильный вход.Что я делаю не так?

 16 bytes in 1 blocks are possibly lost in loss record 30 of 844
    ==23027==    at 0x4A05E1C: malloc (vg_replace_malloc.c:195)
    ==23027==    by 0x6525BE: sqlite3MemMalloc (in app_mem.out)
    ==23027==    by 0x63C579: mallocWithAlarm (in app_mem.out)
    ==23027==    by 0x63C904: sqlite3DbMallocRaw (in app_mem.out)
    ==23027==    by 0x6886D6: codeOneLoopStart (in app_mem.out)
    ==23027==    by 0x68A9C8: sqlite3WhereBegin (in app_mem.out)
    ==23027==    by 0x68CC9E: sqlite3Select (in app_mem.out)
    ==23027==    by 0x6A8644: yy_reduce (in app_mem.out)
    ==23027==    by 0x6AAEAC: sqlite3Parser (in app_mem.out)
    ==23027==    by 0x6AB357: sqlite3RunParser (in app_mem.out)
    ==23027==    by 0x6ADF84: sqlite3Prepare (in app_mem.out)
    ==23027==    by 0x6AE82B: sqlite3LockAndPrepare (in app_mem.out)

Ответы [ 3 ]

12 голосов
/ 24 июля 2011

FAQ, включенный в версию 3.6.1 исходного кода Valgrind, развивает немного больше:

«возможно, потеряно» означает, что ваша программа утечка памяти, если вы не делаете необычные вещи с указателямиэто может заставить их указывать на середину выделенного блока ;см. руководство пользователя для некоторых возможных причин.Используйте --show-возможно-lost = no, если вы не хотите видеть эти отчеты.

(5.2. Разное, FAQ по Valgrind)

В руководстве пользователя Valgrind говорится окак он отслеживает все блоки кучи, выделенные с помощью malloc / new, и описывает два способа отслеживания памяти:

  1. Поддерживая «указатель начала» на начало блока памяти
  2. Поддерживая внутренний указатель на какое-то место в середине блока

Три ситуации, в которых могут возникать внутренние указатели:

  1. Первоначально указатель мог быть указателем начала и перемещался программой намеренно (или не намеренно).
  2. Это может быть случайное значение нежелательной памяти в памяти, совершенно не связанное, просто совпадение.
  3. Это может быть указатель на массив объектов C ++ (которые имеют деструкторы), выделенных с помощью нового [].

Возможные сценарии:

     Pointer chain            AAA Category    BBB Category
     -------------            ------------    ------------
(5)  RRR ------?-----> BBB                    (y)DR, (n)DL
(6)  RRR ---> AAA -?-> BBB    DR              (y)IR, (n)DL
(7)  RRR -?-> AAA ---> BBB    (y)DR, (n)DL    (y)IR, (n)IL
(8)  RRR -?-> AAA -?-> BBB    (y)DR, (n)DL    (y,y)IR, (n,y)IL, (_,n)DL

Pointer chain legend:
- RRR: a root set node or DR block
- AAA, BBB: heap blocks
- --->: a start-pointer
- -?->: an interior-pointer

Category legend:
- DR: Directly reachable
- IR: Indirectly reachable
- DL: Directly lost
- IL: Indirectly lost
- (y)XY: it's XY if the interior-pointer is a real pointer
- (n)XY: it's XY if the interior-pointer is not a real pointer
- (_)XY: it's XY in either case

(4.2.7Обнаружение утечки памяти, использование Valgrindr manual)

Оказывается, предупреждение «Возможно, потеряно» охватывает блок 5-8 (для BBB) выше.

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

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

ТАК, довольно длинным путем мы пришли к тому же выводу, что и fbafelipe, то есть;при условии, что вы используете API правильно, либо sqlite теряет немного памяти, либо использует один из допустимых случаев выше.Учитывая зрелость проектов sqlite, вероятно, можно с уверенностью предположить, что предупреждение не вызывает особых опасений.

Если вы предоставите больше информации о том, как вы используете API (и при каких обстоятельствах происходит утечка)другие люди могут предоставить больше информации.

Ссылка: Источник Valgrind 3.6.1, doc / faq.html, doc / mc-manual.html

5 голосов
/ 19 февраля 2012

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

«Ошибка 573688 содержит новую информацию - все это« возможные утечки »и ложные срабатывания, потому что SQLite перемещает свои указатели в блоки кучи на 8 байт от начала блока. Самый простой способ исправить это расширитьValgrind специально для подавления отчетов о «возможной утечке», в настоящее время вы можете только подавить все утечки, которые были бы опасны, так как любые утечки SQLite никогда не будут обнаружены (хотя я полагаю, что это может быть разумным шагом тем временем.) "

Ошибка 639408 - Подавление sqlite-утечек в прогонах Valgrind

5 голосов
/ 21 июля 2011

С Valgrind faq : «возможно, потеряно» означает, что ваша программа утечка памяти, если вы не делаете забавные вещи с указателями. Это иногда разумно. Используйте --show-возможно-lost = no, если вы не хотите видеть эти отчеты.

...