I'm compiling a project with automake, but when attempting to run valgrind on the resulting executable, it does not behave as expected, appearing to run 8 times before actually executing the code that I want to check, and the heap summary for that piece of code is not displayed at all:
==4601== Memcheck, a memory error detector
==4601== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==4601== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==4601== Command: ./launcher -g ../data/params.txt
==4601==
==4605==
==4605== HEAP SUMMARY:
==4605== in use at exit: 0 bytes in 0 blocks
==4605== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4605==
==4605== All heap blocks were freed -- no leaks are possible
==4605==
==4605== For counts of detected and suppressed errors, rerun with: -v
==4605== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==4604==
==4604== HEAP SUMMARY:
==4604== in use at exit: 0 bytes in 0 blocks
==4604== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4604==
==4604== All heap blocks were freed -- no leaks are possible
==4604==
==4604== For counts of detected and suppressed errors, rerun with: -v
==4604== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==4606==
==4606== HEAP SUMMARY:
==4606== in use at exit: 0 bytes in 0 blocks
==4606== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4606==
==4606== All heap blocks were freed -- no leaks are possible
==4606==
==4606== For counts of detected and suppressed errors, rerun with: -v
==4606== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==4608==
==4608== HEAP SUMMARY:
==4608== in use at exit: 0 bytes in 0 blocks
==4608== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4608==
==4608== All heap blocks were freed -- no leaks are possible
==4608==
==4608== For counts of detected and suppressed errors, rerun with: -v
==4608== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==4607==
==4607== HEAP SUMMARY:
==4607== in use at exit: 0 bytes in 0 blocks
==4607== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4607==
==4607== All heap blocks were freed -- no leaks are possible
==4607==
==4607== For counts of detected and suppressed errors, rerun with: -v
==4607== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==4610==
==4610== HEAP SUMMARY:
==4610== in use at exit: 0 bytes in 0 blocks
==4610== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4610==
==4610== All heap blocks were freed -- no leaks are possible
==4610==
==4610== For counts of detected and suppressed errors, rerun with: -v
==4610== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==4613==
==4613== HEAP SUMMARY:
==4613== in use at exit: 0 bytes in 0 blocks
==4613== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4613==
==4613== All heap blocks were freed -- no leaks are possible
==4613==
==4613== For counts of detected and suppressed errors, rerun with: -v
==4613== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==4614==
==4614== HEAP SUMMARY:
==4614== in use at exit: 0 bytes in 0 blocks
==4614== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4614==
==4614== All heap blocks were freed -- no leaks are possible
==4614==
==4614== For counts of detected and suppressed errors, rerun with: -v
==4614== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
[Program output appears here, nothing appears afterwards]
Previously, when compiling with a standard makefile there were no such issues and valgrind would display exactly what I expected. The makefile.am
that I'm using for compiling the directory looks like this:
lib_LTLIBRARIES = libfile_util.la libmath_util.la libgeneral_util.la libparamlist.la
libfile_util_la_SOURCES = file_util.c file_util.h
libmath_util_la_SOURCES = math_util.c math_util.h
libgeneral_util_la_SOURCES = general_util.c general_util.h
libparamlist_la_SOURCES = paramlist.c paramlist.h
bin_PROGRAMS = launcher
generator_CFLAGS = -I/usr/include/muParser
generator_SOURCES = generator.c generator.h
estimator_SOURCES = estimator.c estimator.h
estimator_iwls_SOURCES = estimator_IWLS.c estimator.h
estimator_piecewise_SOURCES = estimator_IWLS.c estimator_piecewise.c estimator.h
estimator_baseline_SOURCES = estimator_IWLS.c estimator_piecewise.c estimator_baseline.c estimator.h
launcher_CFLAGS = -I/usr/include/muParser
launcher_SOURCES = launcher.c generator.c estimator.c estimator.h generator.h
generator_LDADD = libfile_util.la libmath_util.la libgeneral_util.la libparamlist.la
launcher_LDADD = libfile_util.la libmath_util.la libgeneral_util.la libparamlist.la
estimator_iwls_LDADD = libfile_util.la libmath_util.la libgeneral_util.la libparamlist.la
estimator_piecewise_LDADD = libfile_util.la libmath_util.la libgeneral_util.la libparamlist.la
estimator_baseline_LDADD = libfile_util.la libmath_util.la libgeneral_util.la libparamlist.la
Is this issue something to do with the way that automake compiles the files? If so, what am I doing wrong in the makefile?
Because launcher
is using a libtool library, the file that is in your build directory is just a shell script that setups the necessary environment variables to run the real binary (usually hidden in .libs/
). Running valgrind on that script will debug the shell executing the script, not your real binary.
The proper way to execute any command like valgrind
or gdb
on a libtool binary is via the libtool
command:
libtool --mode=execute valgrind ./launcher -g ../data/params.txt
You may even abbreviate it as:
libtool e valgrind ./launcher -g ../data/params.txt
This will work regardless of how launcher
was compiled.
The relevant libtool documentation is here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With