【发布时间】:2018-11-21 20:19:01
【问题描述】:
我正试图找出泄漏的位置。我决定使用 Valgrind。但随着它的使用,应用程序的性能下降了近五倍。我可以使用 Valgrind 加速应用程序吗?
【问题讨论】:
标签: c++ memory-leaks valgrind
我正试图找出泄漏的位置。我决定使用 Valgrind。但随着它的使用,应用程序的性能下降了近五倍。我可以使用 Valgrind 加速应用程序吗?
【问题讨论】:
标签: c++ memory-leaks valgrind
memcheck 工具会降低应用程序的速度,因为幕后的所有虚拟化。您可以研究command line parameters 以寻找可以加快环境速度的调整。作为 gcc/clang 的替代方案,使用 -fsanitize=address 编译和链接。这可能会以更少的性能限制检测您的泄漏。
【讨论】:
如果您正在寻找一种完全不会减慢进程的替代工具,但它的局限性在于它不会给您任何堆栈跟踪,需要在 Linux 上运行并且仅支持 libc malloc(如反对 jemalloc 或 tcmalloc 或等效)尝试免费的开源软件https://github.com/vmware/chap
您使用它的方式大致是,在进程表现出不希望的内存增长后,获取未检测进程的实时核心(使用 gcore,或从 gdb 或类似的东西生成),然后从命令行:
章节核心文件名
在章节提示符下键入 count leaked 将告诉您有多少泄漏,list leaked 将列出泄漏的分配,show leaked将为您提供泄漏分配的十六进制转储,describe leaked 将尝试描述泄漏的分配或 summarize leaked 将按类型为您提供分配的摘要,在某种程度上小伙子可以弄清楚类型。
...
如果应该发生 count leaked 表示没有泄漏,或者不足以解释您的进程增长,这意味着不是泄漏的对象实际上无法从堆栈或寄存器中访问或静态内存(大致是chap 对泄漏的定义),它们可能位于某些容器或容器中,例如集合、映射或队列。在这种情况下,chap 也可以提供帮助,因为它使您有机会遍历分配图,其中此类图中的节点是分配本身,并且如果分配 A 引用分配 B,则 A 和 B 之间的两个方向都有边。使用这个事实,您通常可以将图表从您认为不再需要的分配中遍历到保存它的容器。鉴于您使用的是 C++,在这种情况下开始使用的一个非常有用的 chap 命令是summarize allocation。
作为免责声明,我编写了这个工具的大部分内容,并且肯定会在这里推广它,但 OTOH 它是开源的,不需要任何费用。该文档仍在进行中,但您也可以从该工具的命令行获得帮助。此外,如果您提出问题(与此答案相关或通过在 github 存储库上提出问题),我将很乐意回答。
【讨论】: