Running valgrind on project compiled with autotools outputs multiple heap summaries
Asked Answered
C

1

5

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?

Camacho answered 3/1, 2013 at 10:7 Comment(1)
I think if you check, the "launcher" binary that you made is actually a shell script that runs the binary you wanted to make in the first place. I can't remember the magic incantation to make libtool stop doing this. It has something to do with running the binary "uninstalled". Hopefully this points you in the right direction!Flame
L
10

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.

Loiseloiter answered 6/1, 2013 at 20:37 Comment(1)
This is a far better solution than the other option.Pistoia

© 2022 - 2024 — McMap. All rights reserved.