18

我正在使用 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

并且它按预期生成了多个内存使用量非零的快照。

我尝试使用我能想到的所有关键字组合在线搜索,但没有发现任何类似的问题。

附带说明一下,我可以使用 valgrind 的默认 memcheck 工具成功地分析应用程序,以防万一这是有用的信息。

有谁知道为什么 massif 无法分析我的应用程序?

4

1 回答 1

19

如果应用程序是静态链接的,则无法使用 valgrind 对其进行分析。Valgrind 通过为您的程序提供它自己的分配函数版本来工作,它通过覆盖动态查找来完成。

如果您可以动态链接标准库(libc 和 libstdc++),那么它应该能够执行您正在寻找的内存分析。

来自Valgrind 常见问题解答:

其次,如果您的程序是静态链接的,大多数 Valgrind 工具将无法正常工作,因为它们无法用自己的版本替换某些函数,例如 malloc。

于 2012-11-27T19:38:06.223 回答