Я пытаюсь valgrind для обнаружения утечки памяти. Он хорошо работает при утечке кучи (то есть выделение памяти из malloc или new). однако поддерживает ли проверка mmap утечки в Linux?
Спасибо
Чанг
Не напрямую, очень сложно отлаживать, посмотрите 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.
К сожалению, memcheck от Valgrind не поддерживает отслеживание mmap (по крайней мере, не из коробки), но есть надежда.
Я недавно сталкивался Valgrind-MMT, Valgrind-форк для отслеживания доступа к памяти в mmap и ее распределения:
https://nouveau.freedesktop.org/wiki/Valgrind-mmt
Разработано envytools, и, кажется, используется в основном для разработки графических драйверов.
Инструмент трассировки mmap, mmt
, делает глубокую трассировку на все доступ к mmapped памяти, в том числе загрузки и хранения. Это может быть слишком много для работы по обнаружению утечки памяти mmap, и выходные данные инструмента должны быть обработаны и проанализированы, но при некоторой тщательной работе это может быть полезно для обнаружения сценариев утечки mmap. Лично я пользовался этим лишь частично, но, возможно, другим повезет больше.
Обратите внимание, что он может не подходить для анонимные распределения mmap.
Для начала:
Запустите valgrind со следующими параметрами:
/usr/local/bin/valgrind --tool=mmt --mmt-trace-file=[mmapped-file-to-be-traced] --log-file=mmt-log.bin
Расшифровать вывод MMT: demmt -l mmt-log.bin > mmt-log.txt