Valgrind 的地块工具不会分析我的应用程序

Posted

技术标签:

【中文标题】Valgrind 的地块工具不会分析我的应用程序【英文标题】:Valgrind's massif tool will not profile my application 【发布时间】:2012-11-15 07:47:05 【问题描述】:

我正在使用 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 无法分析我的应用程序吗?

【问题讨论】:

你的程序是静态链接的吗?如果您执行“ldd ./MyProg”,它会列出一堆共享库,还是什么都不打印? 它是静态链接的。我已经编辑了问题以澄清这一点。 【参考方案1】:

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

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

来自Valgrind FAQ:

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

【讨论】:

谢谢。我错过了常见问题解答的那部分。更改为部分动态链接后,我可以获得个人资料。 基于 valgrind-users 邮件列表中的conversation,valgrind 应该能够从 3.8.1 版开始分析静态链接的应用程序。根据邮件列表中的要求,我已为此提交了bug。

以上是关于Valgrind 的地块工具不会分析我的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind使用介绍

Valgrind使用介绍

Valgrind使用介绍

我们可以使用地块仅测量某个时期吗?

Linux下利用Valgrind工具进行内存泄露检测和性能分析

内存泄漏分析valgrind