我有很多可能从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)
答案 0 :(得分:12)
Valgrind源版本3.6.1中包含的FAQ确实详细说明了一些:
“可能丢失”意味着你的程序正在泄漏内存,除非你用指针执行不寻常的事情,这些指针可能导致指向已分配块的中间;有关可能原因,请参阅用户手册。如果您不想看到这些报告,请使用--show-possible-lost = no。
(5.2。其他,Valgrind FAQ)
Valgrind用户手册讨论了如何跟踪使用malloc / 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的更多信息(以及在何种情况下发生泄漏),其他人可能能够提供更多信息。
答案 1 :(得分:5)
来自Valgrind faq:“可能丢失”意味着你的程序正在泄漏内存,除非你用指针做有趣的事情。这有时是合理的。如果您不想看到这些报告,请使用--show-possible-lost = no。
答案 2 :(得分:5)
在使用带有Valgrind的SQLite之后我有同样的好奇心,并且发现了这个错误条目,这表明在SQLite的情况下这是一个误报。似乎SQLite确实使用内部指针,这导致Valgrind做出响应。
“错误573688有新信息 - 这些都是”可能泄漏“和误报,因为SQLite将其指针从块的开头移动到8个字节的堆块。最简单的方法是将Valgrind扩展到压缩“可能泄漏”具体报告;目前你只能压制所有泄漏,这将是危险的,因为任何SQLite泄漏永远不会被捕获。(虽然我认为这可能是一个合理的步骤同时。)“