c++ - 当 Valgrind 什么都不显示时发现内存泄漏
问题描述
我正在寻找具有沉重遗留背景(多线程,使用 libstdc++ 容器)的 Linux 上的 C++ 程序中的内存泄漏。该程序是代理服务器,是从客户端到服务器的请求的中介。
Valgrind 已经检测到一些现在已修复的问题,并且没有更多显示。
但是进程的 RSS(如 /proc//stat 所示的常驻内存)仍然会在给定的重复刺激下增长(每次迭代大约 9 个字节)。这不是线性的,并且会大幅增长,可能是因为 lib c++ 容器进行了内存优化,而 RSS 是通过大小为 4096 字节的页面来衡量的)。
由于 Valgrind 什么也没找到,我可能怀疑一些递归调用会增加堆栈或一些未使用和被遗忘的表(例如:std::list、std::map、std::string 等)不断增长。
我看到的唯一搜索方法是:
- 阅读代码;
- 通过停用部分代码来缩小范围;
但这些都是费力和耗时的。
- 我怎样才能改进我的搜索?是否有用于查找不断增长的堆栈或表格的工具?
- 关于泄漏原因的任何其他想法(悬空指针、不受控制的递归、增长的表除外)?
解决方案
使用https://github.com/vmware/chap:
为此,请收集您的流程的实时核心(在运行一个小时的迭代之后),然后以该核心的路径作为唯一参数开始章节。在章节提示符下,尝试以下操作:
count used
count free
count leaked
count writable
假设报告使用的数量比免费报告的数量大很多,那么接下来要检查的是泄露的数量。如果该数字不为零,则实际上在不再引用的内存意义上存在泄漏。按照 USERGUIDE.md 了解一些分析策略。
如果泄漏的数字为0 或不显着,但使用的数字是您可能有一些容器增长。使用汇总用作下一步。
推荐阅读
- node.js - React 前端,Node JS 后端托管
- asp.net-mvc - 如何在 Asp.net mvc 上的 Syncfusion 条形图中绑定数据库
- key-bindings - 从文件中选择所有行并使用自定义键绑定重新缩进/重新格式化
- docker - 无法将接口连接到 Docker 容器
- plot - 为什么我添加到直方图中的正态分布是平坦的?
- reactjs - Nginx React App - 只允许访问一个位置
- javascript - 我如何从url检测flutter web中的javascript输出
- scipy - 使用 xarray DataArray 作为输入时,如何获取从 RegularGridInterpolator 返回的一维数组?
- python - 获取链接重定向到的网址的最简单方法是什么?
- php - 使用 PHP 在 MySQL 中未捕获的 PDOException