2012-11-27 39 views
10

我正在使用CentOS存儲庫中的標準gcc 4.4軟件包在64位CentOS 5.8上開發一個靜態鏈接的64位C++應用程序。它似乎使用了比我預期更多的內存,所以我嘗試使用地塊來分析內存使用情況。我已經編譯調試信息,然後運行Valgrind的地塊工具不會剖析我的應用程序

的valgrind --tool =從那裏MYPROG所在的目錄地塊./MyProg

。除了以下massif.out.XXXX示例以外,它絕不會產生任何結果。

desc: (none) 
cmd: ./MyProg 
time_unit: i 
#----------- 
snapshot=0 
#----------- 
time=0 
mem_heap_B=0 
mem_heap_extra_B=0 
mem_stacks_B=0 
heap_tree=empty 

請注意,這是文件的全部內容,我的程序可以運行很多分鐘。

我已經嘗試過valgrind和massif的各種選項無濟於事。我甚至嘗試過使用MyProg的絕對路徑,以防萬一。我試着下載最新版本的valgrind(3.8.1),並編譯並運行(自CentOS使用3.5.0以來),結果相同。作爲健全性檢查我跑

的valgrind --tool =地塊的ls -l

和它產生的多個快照具有非零的內存使用情況按預期方式。

我試過使用關鍵字的每個組合都可以在網上搜索,但我沒有發現任何類似的問題。作爲一個方面說明,我可以使用valgrind的默認memcheck工具成功分析應用程序,以防萬一這是有用的信息。

有誰知道爲什麼地塊將無法分析我的應用程序?

+0

您的程序是靜態鏈接的嗎?如果你做了'ldd ./MyProg',它列出了一堆共享庫,還是不打印任何內容? –

+0

它是靜態鏈接的。我編輯了這個問題來澄清這一點。 – Tyson

回答

9

如果應用程序是靜態鏈接的,則不能使用valgrind進行分析。 Valgrind通過爲程序提供自己版本的分配函數來工作,它通過重寫動態查找來完成。

如果你可以動態鏈接標準庫(libc和libstdC++),那麼它應該可以執行你正在尋找的內存分析。

Valgrind FAQ:

其次,如果你的程序是靜態連接的,最Valgrind的工具將無法正常工作爲好,因爲他們將無法更換某些功能,例如malloc,用自己自己的版本。

+0

謝謝。我錯過了那部分FAQ。更改爲部分動態鏈接後,我可以獲取配置文件。 – Tyson

+0

基於valgrind-users郵件列表上的[conversation](http://thread.gmane.org/gmane.comp.debugging.valgrind/12653),valgrind應該能夠分析3.8.1版本中靜態鏈接的應用程序上。根據郵件列表的要求,我已經提交了一個[bug](https://bugs.kde.org/show_bug.cgi?id=311093)。 – Tyson

相關問題