首页 > 解决方案 > 当 Valgrind 什么都不显示时发现内存泄漏

问题描述

我正在寻找具有沉重遗留背景(多线程,使用 libstdc++ 容器)的 Linux 上的 C++ 程序中的内存泄漏。该程序是代理服务器,是从客户端到服务器的请求的中介。

Valgrind 已经检测到一些现在已修复的问题,并且没有更多显示。

但是进程的 RSS(如 /proc//stat 所示的常驻内存)仍然会在给定的重复刺激下增长(每次迭代大约 9 个字节)。这不是线性的,并且会大幅增长,可能是因为 lib c++ 容器进行了内存优化,而 RSS 是通过大小为 4096 字节的页面来衡量的)。

由于 Valgrind 什么也没找到,我可能怀疑一些递归调用会增加堆栈或一些未使用和被遗忘的表(例如:std::list、std::map、std::string 等)不断增长。

我看到的唯一搜索方法是:

但这些都是费力和耗时的。

标签: c++linuxmemory-leaks

解决方案


使用https://github.com/vmware/chap

为此,请收集您的流程的实时核心(在运行一个小时的迭代之后),然后以该核心的路径作为唯一参数开始章节。在章节提示符下,尝试以下操作:

count used
count free
count leaked
count writable

假设报告使用的数量比免费报告的数量大很多,那么接下来要检查的是泄露的数量。如果该数字不为零,则实际上在不再引用的内存意义上存在泄漏。按照 USERGUIDE.md 了解一些分析策略。

如果泄漏的数字为0 或不显着,但使用的数字是您可能有一些容器增长。使用汇总用作下一步。


推荐阅读