Что значит возможное потерянное в валгринде
У меня есть много возможных потерянных записей из Вальгринда. Что это значит? Поскольку я использую 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 никогда не будут обнаружены. (Хотя я полагаю, что это может быть разумным шагом в то же время.)"
FAQ, включенный в версию 3.6.1 исходного кода Valgrind, развивает немного больше:
"возможно, потеряно" означает, что ваша программа утечка памяти, если вы не делаете необычные вещи с указателями, которые могут заставить их указывать на середину выделенного блока; см. руководство пользователя для некоторых возможных причин. Используйте --show-возможно-lost=no, если вы не хотите видеть эти отчеты.
(5.2. Разное, FAQ по Valgrind)
Руководство пользователя Valgrind рассказывает о том, как он отслеживает все блоки кучи, выделенные с помощью malloc / new, и описывает два способа отслеживания памяти:
- Поддерживая "указатель начала" на начало блока памяти
- Поддерживая "указатель интерьера" в некотором месте в середине блока
Три ситуации, в которых могут возникнуть внутренние указатели:
- Первоначально указатель мог быть указателем начала и был намеренно (или не намеренно) перемещен программой.
- Это может быть случайное нежелательное значение в памяти, совершенно не связанное, просто совпадение.
- Это может быть указатель на массив объектов 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 (для ВВВ), блок выше.
Это означает, что цепочка из одного или нескольких указателей на блок была найдена, но по крайней мере один из указателей является внутренним указателем. Это может быть просто случайное значение в памяти, которое указывает на блок, и поэтому вы не должны считать это нормальным, если не знаете, что у вас есть внутренние указатели.
(4.2.7. Обнаружение утечки памяти, руководство пользователя Valgrind)
Итак, довольно долго мы пришли к тому же выводу, что и fbafelipe; при условии, что вы используете API правильно, либо sqlite теряет немного памяти, либо использует один из допустимых случаев выше. Учитывая зрелость проектов sqlite, вероятно, можно с уверенностью предположить, что предупреждение не вызывает особых опасений.
Если вы предоставите больше информации о том, как вы используете API (и при каких обстоятельствах происходит утечка), другие люди могут предоставить больше информации.
Ссылка: источник Valgrind 3.6.1, doc/ faq.html, doc/ mc-manual.html
От Valgrind faq: "возможно, потеряно" означает, что ваша программа теряет память, если вы не делаете забавные вещи с указателями. Это иногда разумно. Используйте --show-возможно-lost=no, если вы не хотите видеть эти отчеты.