2013-01-03 70 views
4

我正在使用automake編譯項目,但試圖在生成的可執行文件上運行valgrind時,它不像預期的那樣運行,似乎在實際執行之前運行8次代碼,我要檢查,併爲這段代碼堆總結根本不顯示:在使用autotools編譯的項目上運行valgrind輸出多個堆摘要

==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] 

以前,有一個標準的makefile編譯時有沒有這樣的問題,的valgrind將顯示正是我所期望。我使用的編譯目錄makefile.am看起來是這樣的:

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 

是這個問題事做與automake的編譯文件的方式?如果是這樣,我在makefile中做錯了什麼?

+3

我想如果你檢查一下,你製作的「啓動器」二進制文件實際上是一個shell腳本,它首先運行你想要創建的二進制文件。我不記得讓libtool停止這樣做的魔法咒語。它與運行二進制「卸載」有關。希望這可以讓你朝着正確的方向發展! –

回答

8

由於launcher正在使用libtool庫,因此構建目錄中的文件只是一個shell腳本,用於設置運行真實二進制文件所需的環境變量(通常隱藏在.libs/中)。在該腳本上運行valgrind將調試執行腳本的shell,而不是真正的二進制文件。

對一個libtool的二進制執行像valgrindgdb任何命令正確的方法是通過libtool命令:

libtool --mode=execute valgrind ./launcher -g ../data/params.txt 

你甚至可以縮寫它爲:

libtool e valgrind ./launcher -g ../data/params.txt 

這無論工作如何編譯launcher

相關的libtool文檔是here

+0

這是比其他選項更好的解決方案。 – Flexo

相關問題