如何在C++中调试单个容器实例的大小

How can I debug the size of individual container instances in C++?

本文关键字:实例 单个容 调试 C++      更新时间:2023-10-16

我有一个庞大的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。