Reputation: 10307
I am working with some original code that reads directly from disk files. There is only one malloc call in the entire beginning code (and I checked that that is no the issue). In my own code, I do not use malloc, strdup, or any other heap calls. However, running valgrind with a full leak check I still get (below).
I don't recognize any of the files that it is showing. I am running this on a Mac OSX with Lion. Is it possible that this is a problem with the system libraries or is their another way to troubleshoot this. I know that some will argue that having reachable memory is okay, but I am curious to know why any of the memory is reachable still.
-
-90966-- REDIR: 0x3a46c7 (free) redirected to 0x55b8 (free)
==90966==
==90966== HEAP SUMMARY:
==90966== in use at exit: 6,383 bytes in 33 blocks
==90966== total heap usage: 34 allocs, 1 frees, 6,899 bytes allocated
==90966==
==90966== Searching for pointers to 33 not-freed blocks
==90966== Checked 684,888 bytes
==90966==
==90966== 8 bytes in 1 blocks are still reachable in loss record 1 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x7FFF5FC11C2A: malloc (in /usr/lib/dyld)
==90966== by 0x7FFF5FC19C4E: operator new(unsigned long) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0817E: std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char const* (**)(dyld_image_states, unsigned int, dyld_image_info const*), std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> > >, char const* (* const&)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC08260: std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> >::insert(__gnu_cxx::__normal_iterator<char const* (**)(dyld_image_states, unsigned int, dyld_image_info const*), std::vector<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*), std::allocator<char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)> > >, char const* (* const&)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC054FA: dyld::registerImageStateBatchChangeHandler(dyld_image_states, char const* (*)(dyld_image_states, unsigned int, dyld_image_info const*)) (in /usr/lib/dyld)
==90966== by 0x2C1ACB: dyld_register_image_state_change_handler (in /usr/lib/system/libdyld.dylib)
==90966== by 0x2C2ACB: _dyld_initializer (in /usr/lib/system/libdyld.dylib)
==90966== by 0x1CFE73: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966==
==90966== 87 bytes in 7 blocks are still reachable in loss record 2 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x342358: strdup (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x4E7802: _xpc_strdup (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDCCF: _xpc_dictionary_insert (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDE0E: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966==
==90966== 88 bytes in 1 blocks are still reachable in loss record 3 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x2CA9B0: get_or_create_key_element (in /usr/lib/system/libkeymgr.dylib)
==90966== by 0x2CABC9: _keymgr_get_and_lock_processwide_ptr_2 (in /usr/lib/system/libkeymgr.dylib)
==90966== by 0x2CAC36: __keymgr_initializer (in /usr/lib/system/libkeymgr.dylib)
==90966== by 0x1CFE6E: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0760A: dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**) (in /usr/lib/dyld)
==90966==
==90966== 136 bytes in 1 blocks are still reachable in loss record 4 of 9
==90966== at 0x58DE: calloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x4E78FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4E81D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4F1C32: _xpc_domain_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFF1E: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==90966==
==90966== 224 bytes in 7 blocks are still reachable in loss record 5 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x4E793D: _xpc_malloc (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDCB4: _xpc_dictionary_insert (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDE0E: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==90966==
==90966== 520 bytes in 7 blocks are still reachable in loss record 6 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x342358: strdup (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x4E7802: _xpc_strdup (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EEBF5: xpc_string_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDDFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966==
==90966== 608 bytes in 1 blocks are still reachable in loss record 7 of 9
==90966== at 0x58DE: calloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x4E78FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4E81D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDFDA: xpc_dictionary_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE63: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC034B7: dyld::initializeMainExecutable() (in /usr/lib/dyld)
==90966==
==90966== 616 bytes in 7 blocks are still reachable in loss record 8 of 9
==90966== at 0x58DE: calloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x4E78FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4E81D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EEBEA: xpc_string_create (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EDDFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==90966== by 0x4EFE8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==90966== by 0x1CFE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==90966== by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966== by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==90966==
==90966== 4,096 bytes in 1 blocks are still reachable in loss record 9 of 9
==90966== at 0x5237: malloc (in /usr/local/Cellar/valgrind/3.8.1/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==90966== by 0x34F3F7: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x345D19: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x3466C3: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x34618D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x34F2CF: printf (in /usr/lib/system/libsystem_c.dylib)
==90966== by 0x1000014D0: main (in .//diskimageaccess)
==90966==
==90966== LEAK SUMMARY:
==90966== definitely lost: 0 bytes in 0 blocks
==90966== indirectly lost: 0 bytes in 0 blocks
==90966== possibly lost: 0 bytes in 0 blocks
==90966== still reachable: 6,383 bytes in 33 blocks
==90966== suppressed: 0 bytes in 0 blocks
==90966==
==90966== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==90966== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
EDIT:
I tried moving the code over to a Linux machine and it compiles and runs perfectly cleanly without any memory errors. Any ideas why this is?
Upvotes: 0
Views: 2337
Reputation: 28727
The reachable memory messages are not a real problem, but can be a nuisance because they can drown out the real problems (scrolling blindness). The memory gets allocated by OS X XPC. Perhaps you are talking to an OS X service in your program.
For my own development I use a cleanup-function shut_up_valgrind()
. This deallocates everything just before exit. I know this is superfluous, because the operating system will free all the memory used by the process. But in my experience it forced me to write more robust code because I had to think about the memory and discovered many well hidden memory allocation mistakes.
Now, if you have dependencies like on XPC, you can look for cleanup-functions. Try to find out. Perhaps it suffices to close something. Then call the cleanup-functions just before exit from your shut_up_valgrind()
function.
Upvotes: 1
Reputation: 3071
No need to worry about still reachable memory.
You can see clearly from call stack in valgrind logfile that memory is being allocated from heap via memory functions. viz malloc()
& calloc()
Upvotes: 0
Reputation: 13580
Well, someone must be using these functions if valgrind tells you that. If you're sure that you are not using any heap-functions then some of your dependencies is using malloc/calloc
. Which libraries do you use?
Upvotes: 1