2013-03-12 77 views
2

我有一個意外地使用大量堆(大約3GB)的程序。我通過valgrind memcheck運行它,它報告沒有泄漏,聲稱所有的堆內存都可以訪問。爲什麼valgrind地塊不報告任何函數名稱或代碼引用?

所以我用調試選項重建了所有庫,並通過valgrind地塊運行prog。我正在使用Valgrind-3.8.1,我今天剛剛下載並構建在我的盒子上。命令行是:

valgrind --tool=massif myprog 

Valgrind沒有產生任何錯誤或警告。生成的輸出文件報告所有已分配的內存,但所有的大的分配的堆棧跟蹤無法識別的功能名稱或代碼位置,例如:

97.34% (2,595,141,447B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. 
->88.67% (2,363,882,948B) 0xCA6ACC0: ??? 
| ->88.67% (2,363,882,948B) 0xC7D7A71: ??? 
| ->88.67% (2,363,882,948B) 0xC7D705E: ??? 
|  ->88.67% (2,363,882,948B) 0xA6ACB65: ??? 
|  ->59.01% (1,573,247,120B) 0xA6AC9BA: ??? 
|  | ->59.01% (1,573,247,120B) 0x9410C08: ??? 
|  | ->59.01% (1,573,247,120B) 0x94123E2: ??? 
|  |  ->59.01% (1,573,247,120B) 0x940B3E9: ??? 
|  |  ->59.01% (1,573,247,120B) 0x9428BC0: ??? 
|  |   ->59.01% (1,573,247,120B) 0x98B0564: ??? 
|  |   ->59.01% (1,573,247,120B) 0x9AF0DA0: ??? 
|  |    ->59.01% (1,573,247,120B) 0x9AF09BE: ??? 
|  |    ->59.01% (1,573,247,120B) 0x9AF0E6C: ??? 
|  |     ->59.01% (1,573,247,120B) 0x4CE6438: run_S (Thread.cpp:98) 
|  |     ->59.01% (1,573,247,120B) 0x3A9A40683B: start_thread (in /lib64/libpthread-2.5.so) 
|  |      ->59.01% (1,573,247,120B) 0x3A994D503B: clone (in /lib64/libc 2.5.so) 

我現在有點卡住。我想知道我構建的庫實際上是否沒有啓用調試 - 但是當我在gdb中運行我的代碼時,它似乎具有所有的調試信息。此外,massif輸出中還有一些其他(更小的)內存分配結果,用於從我的代碼中識別函數名稱和位置。

這些結果是否指示系統或外部庫中的堆棧跟蹤?這就是爲什麼沒有信息?任何人都可以建議我如何跟蹤這些分配?

回答

1

認爲答案是RTFM ...看到的valgrind FAQ 4.2節:

此外,對於涉及共享對象,泄漏報告如果共享對象 卸載程序結束前,Valgrind的將丟棄調試 信息和錯誤信息將充滿?條目。解決方法 這裏是爲了避免在這些共享對象上調用dlclose。

我的代碼確實在退出前明確地卸載了它的共享庫。我正在重建與圖書館卸載壓制 - 希望有更好的結果:)

相關問題