我正在使用CentOS存储库中的标准gcc 4.4软件包在64位CentOS 5.8上开发静态链接的64位C ++应用程序。它似乎使用了比我预期更多的内存,所以我尝试使用massif来分析内存使用情况。我编译了调试信息,然后运行
valgrind --tool = massif ./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 = massif ls -l </ p>
并且它产生了多个快照,并且按预期使用了非零内存。
我尝试使用我能想到的各种关键字组合在线搜索,但没有发现任何类似的问题。
作为旁注,我可以使用valgrind的默认memcheck工具成功分析应用程序,以防有用信息。
有谁知道为什么massif无法描述我的应用程序?
答案 0 :(得分:15)
如果应用程序是静态链接的,则无法使用valgrind进行分析。 Valgrind的工作原理是为程序提供自己的分配函数版本,它可以通过覆盖动态查找来实现。
如果您可以动态链接标准库(libc和libstdc ++),那么它应该能够执行您正在寻找的内存分析。
其次,如果您的程序是静态链接的,那么大多数Valgrind工具都无法正常工作,因为它们无法用自己的版本替换某些功能,例如malloc。