Что означает possible lost в valgrind

Я много потерял запись с Valgrind. Что это значит ? Поскольку я использую 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 ответов


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

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

ошибка 639408-подавить утечки sqlite в Valgrind работает


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

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

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

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

  1. путем поддержания "стартового указателя" на начало блока памяти
  2. путем поддержания "нутряного указателя" к некоторому положению в середине блока

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

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

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

     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. Обнаружение утечки памяти, Valgrind руководство пользователя)

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

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

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

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

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

ссылки: Valgrind 3.6.1 источник, doc / faq.html, doc / mc-руководство.HTML-код


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