Valgrind工作缓慢

时间:2018-06-12 12:20:14

标签: c++ memory-leaks valgrind

我试图弄清楚泄漏的位置。我决定使用Valgrind。但随着它的使用,应用程序的性能下降了近五倍。我可以使用Valgrind来加速应用程序吗?

2 个答案:

答案 0 :(得分:4)

由于幕后的所有虚拟化,memcheck工具会降低应用程序的速度。您可以研究command line parameters来寻找可以加速环境的调整。作为gcc / clang的替代方案,编译并链接-fsanitize=address。这可能会在较少的性能限制下检测到您的泄漏。

答案 1 :(得分:1)

如果您正在寻找一种根本不会减慢流程速度的替代工具,但是它具有无法为您提供任何堆栈跟踪的限制,则需要在Linux上运行并且仅支持libc malloc(相对于jemalloc或tcmalloc或等价物)尝试免费的开源软件https://github.com/vmware/chap

你使用它的方式大致是,在进程表现出不希望的内存增长之后,从命令行中获取未经过检测的进程的实时核心(使用gcore,或者从gdb或类似的东西生成): / p>

chap core-file-name

从chap提示输入 count leaked 将告诉您有多少泄漏,列表泄露将列出泄漏的分配,显示泄露将给出泄漏分配的十六进制转储,描述泄露将尝试描述泄漏的分配或汇总泄露将按类型为您提供分配的摘要,达到chap可以弄清楚类型。

...

如果发生计数泄露表示没有泄漏,或者不足以解释您的流程增长,那意味着不是泄漏的对象实际上无法从堆栈或寄存器中访问或静态内存(大概是泄漏的定义)它们可能在某些容器或容器中,例如集合或映射或队列。在这种情况下,chap也可以提供帮助,因为它使您有机会走分配图,其中这种图中的节点本身就是分配,如果分配A引用分配B,则A和B之间的两个方向都有边。使用这个事实,您通常可以将图表从您认为不再需要的分配走到容纳它的容器中。鉴于您正在使用C ++,在这种情况下,一个非常有用的chap命令是汇总分配

作为免责声明,我写了大部分这个工具,我肯定在这里推广它,但OTOH它是开源的并且不需要任何费用。该文档仍在进行中,但您也可以从该工具的命令行获得帮助。此外,如果您提出问题(相对于此答案或通过在github存储库上提出问题),我将很乐意回答这些问题。