Valgrind的Massif工具不能对我的应用程序进行分析。

19

我正在使用标准的gcc 4.4软件包在64位CentOS 5.8上开发一个静态链接的64位C++应用程序。它似乎比我预期的使用更多的内存,所以我尝试使用massif来分析内存使用情况。我已经编译了调试信息,然后在MyProg所在的目录下运行

valgrind --tool=massif ./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

它生成了多个非零内存使用量的快照,正如预期。

我尝试使用我能想到的每个关键字的组合在网上搜索,但没有找到任何类似的问题。

顺便说一句,如果有用的话,我可以成功地使用valgrind的默认memcheck工具对应用程序进行分析。

有人知道为什么massif不能对我的应用程序进行分析吗?


你的程序是静态链接的吗?如果你执行 'ldd ./MyProg' 命令,它会列出一堆共享库还是什么都不输出? - Dave S
它是静态链接的。我已经编辑了问题以澄清这一点。 - Tyson
1个回答

19
如果应用程序是静态链接的,则无法使用valgrind进行分析。Valgrind通过提供其自己的分配函数版本来为您的程序工作,这是通过覆盖动态查找实现的。
如果您可以动态链接标准库(libc和libstdc ++),那么它可能能够执行您正在寻找的内存分析。
来自Valgrind FAQ: 其次,如果您的程序是静态链接的,则大多数Valgrind工具将无法正常工作,因为它们无法替换某些函数,例如malloc,使用它们自己的版本。

谢谢。我错过了FAQ的那一部分。更改为部分动态链接后,我能够获得一个配置文件。 - Tyson
根据valgrind-users邮件列表上的对话,从3.8.1版本开始,valgrind应该能够分析静态链接的应用程序。根据邮件列表的要求,我已经提交了一个错误报告 - Tyson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接