我在试着找出泄密的地方。我决定使用Valgrind。但随着它的使用,应用程序的性能几乎下降了五倍。我可以使用Valgrind提高应用程序的速度吗?
发布于 2018-06-12 20:31:38
由于幕后的虚拟化,memcheck工具会降低应用程序的运行速度。您可以研究command line parameters来寻找可以加快环境速度的调整。作为gcc/clang的替代方案,使用-fsanitize=address进行编译和链接。这可能会以更少的性能限制来检测您的漏洞。
发布于 2018-06-13 20:24:50
如果您正在寻找一种替代工具,它根本不会减慢进程,但具有以下限制:它不会给您任何堆栈跟踪,需要在Linux上运行,并且只支持libc malloc (与jemalloc或tcmalloc或类似工具相反),请尝试免费开源软件https://github.com/vmware/chap
粗略地说,你使用它的方式是,在进程表现出不希望的内存增长之后,获取未检测的进程的活动内核(使用gcore,或从gdb或类似的东西生成),然后从命令行获取:
chap核心-文件名
在chap提示符下键入count leaked将告诉您泄漏的数量,list leaked将列出泄漏的分配,show leaked将为您提供泄漏的分配的十六进制转储,describe leaked将尝试描述泄漏的分配或 summary 将按类型向您提供分配的摘要,以使chap能够找出类型。
..。
如果发生count leaked表示没有泄漏,或者不足以解释您的进程增长,这意味着实际上无法从堆栈或寄存器或静态内存访问泄漏的对象(大致是chap对泄漏的定义),它们可能位于某个或多个容器中,例如set、map或queue。在这种情况下,chap也会有所帮助,因为它让您有机会遍历分配图,这样的图中的节点就是分配本身,如果分配A引用了分配B,那么A和B之间就有双向的边。使用这一事实,您通常可以将图从您认为不再需要的分配遍历到包含它的容器。考虑到您使用的是C++,在这种情况下,一个非常有用的chap命令是 command 。
作为这里的免责声明,我编写了这个工具的大部分内容,并且肯定会在这里推广它,但是OTOH它是开源的,不需要任何成本。文档仍在编写中,但您也可以从该工具的命令行中获得帮助。此外,如果您提出问题(无论是与此答案相关的问题,还是通过在github存储库上提出问题),我都很乐意回答。
https://stackoverflow.com/questions/50817085
复制相似问题