调试工具跟踪程序中所有STL容器的大小
Debug tool to track size of all STL containers in program?
有什么可以跟踪C++程序中每个容器的大小吗?我有一个必须实时运行才能真正工作的程序,其中的内存会随着时间的推移而增长,这可能是由于STL容器,我在使用完它们后忘记了清理节点。
它们不是适当的内存泄漏,但有很多容器我可以在其中写入数据,用它做一段时间的事情,删除条目(我似乎没有一直这样做),然后继续前进。我想看看我是否可以找到我忘记清理的容器。我很抱歉,我确信这一定是一个重复的问题,但我一辈子都找不到答案。
限制:
- 我必须实时运行我的程序,否则它将彻底改变程序的进程
- 我没有设置IDE来运行我的代码
- 它必须在Linux上运行
遗憾的是,我只限于这些,我无法改变这一点。有什么想法不想把向量等的每个实例都打包并在代码中打印出来吗?
一种有趣的方法是编写一个自定义分配器,它可能非常强大,性能也很高,但工作量并不小。从最小分配器开始,如下所述:http://en.cppreference.com/w/cpp/concept/Allocator.然后,您可以添加两个关键内容:首先,在构建时,您可以获得回溯(例如。https://panthema.net/2008/0901-stacktrace-demangled/,有很多在线资源),并将回溯与this
指针一起记录。然后,在每次分配和解除分配调用中,您都可以将分配/解除分配的大小和该指针一起记录下来。
最终,您的日志文件将包含指针映射的所有分配和释放大小,以及一个回溯,它将让您了解每个指针在代码中对应的对象。您可以添加额外的日志记录语句,以了解这些语句相对于程序控制流的发生位置。然后,您可以轻松地编写一个python脚本,该脚本将运行分配/释放的总和,以查看程序中各个点的容器大小。
一旦您编写了自定义分配器,您当然需要在任何地方使用它,这有点烦人,但并不太难。最好将容器类型分解为中心头文件中的typedef,这样之后每个类型都可以改回标准分配器。
感谢大家的建议。您可能是对的,唯一的方法就是实际编辑分配器并添加我自己的代码。
最后,由于Valgrind太慢,我尝试了gperftools,它也太慢了,但至少足够快,可以让我对代码中发生的事情有一点了解。谢谢大家的建议。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 光线跟踪器灯光反射错误
- 在STL容器中使用模板类
- 人脸跟踪arduino代码的优化
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 跟踪滚动条上的鼠标事件
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 如何使用新运算符跟踪在循环中创建的 QLabel
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 跟踪重复键 STL 映射
- 如何使用STL正确跟踪地址
- 调试工具跟踪程序中所有STL容器的大小
- 如何跟踪指向STL列表元素的指针