调试工具跟踪程序中所有STL容器的大小

Debug tool to track size of all STL containers in program?

本文关键字:STL 跟踪 程序 调试工具      更新时间:2023-10-16

有什么可以跟踪C++程序中每个容器的大小吗?我有一个必须实时运行才能真正工作的程序,其中的内存会随着时间的推移而增长,这可能是由于STL容器,我在使用完它们后忘记了清理节点。

它们不是适当的内存泄漏,但有很多容器我可以在其中写入数据,用它做一段时间的事情,删除条目(我似乎没有一直这样做),然后继续前进。我想看看我是否可以找到我忘记清理的容器。我很抱歉,我确信这一定是一个重复的问题,但我一辈子都找不到答案。

限制:

  • 我必须实时运行我的程序,否则它将彻底改变程序的进程
  • 我没有设置IDE来运行我的代码
  • 它必须在Linux上运行

遗憾的是,我只限于这些,我无法改变这一点。有什么想法不想把向量等的每个实例都打包并在代码中打印出来吗?

一种有趣的方法是编写一个自定义分配器,它可能非常强大,性能也很高,但工作量并不小。从最小分配器开始,如下所述:http://en.cppreference.com/w/cpp/concept/Allocator.然后,您可以添加两个关键内容:首先,在构建时,您可以获得回溯(例如。https://panthema.net/2008/0901-stacktrace-demangled/,有很多在线资源),并将回溯与this指针一起记录。然后,在每次分配和解除分配调用中,您都可以将分配/解除分配的大小和该指针一起记录下来。

最终,您的日志文件将包含指针映射的所有分配和释放大小,以及一个回溯,它将让您了解每个指针在代码中对应的对象。您可以添加额外的日志记录语句,以了解这些语句相对于程序控制流的发生位置。然后,您可以轻松地编写一个python脚本,该脚本将运行分配/释放的总和,以查看程序中各个点的容器大小。

一旦您编写了自定义分配器,您当然需要在任何地方使用它,这有点烦人,但并不太难。最好将容器类型分解为中心头文件中的typedef,这样之后每个类型都可以改回标准分配器。

感谢大家的建议。您可能是对的,唯一的方法就是实际编辑分配器并添加我自己的代码。

最后,由于Valgrind太慢,我尝试了gperftools,它也太慢了,但至少足够快,可以让我对代码中发生的事情有一点了解。谢谢大家的建议。