Does valgrind memcheck support checking mmap

2019-04-24 15:08发布

问题:

I am trying valgrind for detecting memory leak. It works well on heap leak(i.e. memory allocation from malloc or new). however, does it support check mmap leaking in linux?

Thanks Chang

回答1:

Not directly, it's very hard to debug, take a look to valgrind.h

   VALGRIND_MALLOCLIKE_BLOCK should be put immediately after the point where a
   heap block -- that will be used by the client program -- is allocated.
   It's best to put it at the outermost level of the allocator if possible;
   for example, if you have a function my_alloc() which calls
   internal_alloc(), and the client request is put inside internal_alloc(),
   stack traces relating to the heap block will contain entries for both
   my_alloc() and internal_alloc(), which is probably not what you want.

   For Memcheck users: if you use VALGRIND_MALLOCLIKE_BLOCK to carve out
   custom blocks from within a heap block, B, that has been allocated with
   malloc/calloc/new/etc, then block B will be *ignored* during leak-checking
   -- the custom blocks will take precedence.

   VALGRIND_FREELIKE_BLOCK is the partner to VALGRIND_MALLOCLIKE_BLOCK.  For
   Memcheck, it does two things:

   - It records that the block has been deallocated.  This assumes that the
     block was annotated as having been allocated via
     VALGRIND_MALLOCLIKE_BLOCK.  Otherwise, an error will be issued.

   - It marks the block as being unaddressable.

   VALGRIND_FREELIKE_BLOCK should be put immediately after the point where a
   heap block is deallocated.


回答2:

Sadly, valgrind's memcheck doesn't support mmap tracking (at least not out of the box), but there's hope.

I've recently came across valgrind-mmt, a valgrind fork for tracing mmap memory accesses and allocations: https://nouveau.freedesktop.org/wiki/Valgrind-mmt

It is developed by envytools, and seems to be used mostly for graphic drivers developement.

The mmap tracing tool, mmt, does deep tracing on all access to mmapped memory, including loads and stores. This may be too much for the job of finding leaking mmap memory, and the output of the tool needs be processed and analyzed, but with some careful work it may be useful for detecting mmap leak scenarios. Personally, I've had only partial success using it, but perhaps others will be more lucky.

Note that, it may not be suitable for anonymous mmap allocations.


For getting started:

  • Clone and build the envytools/envytools repository
  • Clone and build the envytools/valgrind repository
  • Run valgrind with the following parameters:

    /usr/local/bin/valgrind --tool=mmt --mmt-trace-file=[mmapped-file-to-be-traced] --log-file=mmt-log.bin

  • Decode mmt output: demmt -l mmt-log.bin > mmt-log.txt