在valgrind中可能失去什么意味着什么

时间:2011-07-21 05:24:41

标签: valgrind memcheck

我有很多可能从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 个答案:

答案 0 :(得分:12)

Valgrind源版本3.6.1中包含的FAQ确实详细说明了一些:

  

“可能丢失”意味着你的程序正在泄漏内存,除非你用指针执行不寻常的事情,这些指针可能导致指向已分配块的中间;有关可能原因,请参阅用户手册。如果您不想看到这些报告,请使用--show-possible-lost = no。

(5.2。其他,Valgrind FAQ)

Valgrind用户手册讨论了如何跟踪使用malloc / new分配的所有堆块,并描述了两种可以跟踪内存的方法:

  1. 通过维持“启动指针”到内存块的开头
  2. 通过将“内部指针”保持在块中间的某个位置
  3. 可能发生内部指针的三种情况:

    1. 指针原本可能是一个启动指针,并且已被程序故意(或不是故意)移动。
    2. 它可能是记忆中的随机垃圾值,完全不相关,只是巧合。
    3. 它可能是指向使用new []分配的C ++对象数组(具有析构函数)的指针。
    4. 可能的情况:

           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 source, doc/faq.html, doc/mc-manual.html

答案 1 :(得分:5)

来自Valgrind faq:“可能丢失”意味着你的程序正在泄漏内存,除非你用指针做有趣的事情。这有时是合理的。如果您不想看到这些报告,请使用--show-possible-lost = no。

答案 2 :(得分:5)

在使用带有Valgrind的SQLite之后我有同样的好奇心,并且发现了这个错误条目,这表明在SQLite的情况下这是一个误报。似乎SQLite确实使用内部指针,这导致Valgrind做出响应。

“错误573688有新信息 - 这些都是”可能泄漏“和误报,因为SQLite将其指针从块的开头移动到8个字节的堆块。最简单的方法是将Valgrind扩展到压缩“可能泄漏”具体报告;目前你只能压制所有泄漏,这将是危险的,因为任何SQLite泄漏永远不会被捕获。(虽然我认为这可能是一个合理的步骤同时。)“

Bug 639408 - Suppress sqlite leaks in Valgrind runs