如何在C++中调试单个容器实例的大小
How can I debug the size of individual container instances in C++?
我有一个庞大的C++项目,它利用了标准容器:向量,映射,多映射,集合等。 平台是Linux x86_64,编译器是g ++ 4.9。我在大型数据集中遇到了一些内存问题。现在我想知道:有没有办法查看哪些容器的哪些实例占用的内存最多?有没有像valgrind这样的工具可以做到这一点?可以收集统计信息的修补标准库?
Heaptrack (http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux) 可用于此目的。瓦尔格林德的地块工具也是如此。我已经成功地使用了两者。您可能还想查看 libstdc++ 的调试模式 - https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html
我发现瓦尔格林德地块已经非常有用了。我现在像这样使用它:
valgrind --smc-check=all-non-file --tool=massif --max-snapshots=1000 --vgdb=yes --vgdb-error=0 --massif-out-file=/some/dir/massif-%p.out myprogram
这样,我甚至可以在启动时获得远程gdb控制台,并随时转储更多堆快照。启动后,您需要附加到 gdb 并继续执行:
gdb myprogram
(gdb) target remote | vgdb --pid=pid_of_myprogram
(gdb) continue
在任何时候,您都可以中断和转储快照,此外还可以中断和转储日志文件 massif-[pid].out:
^C
(gdb) monitor detailed_snapshot mysnapshot-1.out
(gdb) continue
我需要 smc 检查,因为我的项目包含一个 JVM。如果您没有自修改代码,则可以将其省略。输出的 1000 个快照可能有点大。默认值为 100。
相关文章:
- 多个 rocksdb 实例:使用单个共享缓存还是多个独立缓存?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 通过单个实例从多个类访问一个类
- 如何在C++中调试单个容器实例的大小
- 传递单个或向量对象时没有重载函数的实例
- Qt - 打开窗口的单个实例
- 如何在崩溃时管理Qt应用程序的单个实例
- C++ 使用单个输入字节文件的不同部分实例化堆栈上的成员类
- 函数的单个实例
- cout 对象是否保持单个实例,即它永远不会被复制
- C++程序的单个实例,使用boost::interprocess
- 许多QPropertyAnimation实例与单个实例相比
- 每个层次结构的单个单一实例继承
- 最大化qt中单个实例应用程序的已运行实例
- Qt new-多个实例或指向单个实例的指针
- 为C++中模板的所有实例生成的单个机器代码实例:它是否可行和/或可能
- 对于单个实例应用程序,只允许使用单个窗口消息框
- 单个类实例在GUI exe和dll中是不同的
- 如何按值从vector中删除元素,但只能删除该值的单个实例
- 单独对象的单个模板实例化