如何在 C++ 中调试单个容器实例的大小?
How can I debug the size of individual container instances in C++?
我有一个巨大的 C++ 项目,它使用标准容器:vector、map、multimap、set 等。平台是 Linux x86_64,编译器是 g++ 4.9。我遇到了一些大数据集的内存问题。现在我想知道:有没有办法查看哪些容器的哪些实例占用内存最多?
有没有像 valgrind 这样的工具可以做到这一点?可以收集统计数据的修补标准库?
我发现 valgrind massif 已经非常有用了。我现在是这样使用它的:
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 控制台,并随时转储更多堆快照。启动后需要attach到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。
Heaptrack (http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux) 可用于此目的。 Valgrind 中的 Massif 工具也是如此。我已经成功地使用了两者。
您可能还想查看 libstdc++ 的调试模式 - https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html
我有一个巨大的 C++ 项目,它使用标准容器:vector、map、multimap、set 等。平台是 Linux x86_64,编译器是 g++ 4.9。我遇到了一些大数据集的内存问题。现在我想知道:有没有办法查看哪些容器的哪些实例占用内存最多? 有没有像 valgrind 这样的工具可以做到这一点?可以收集统计数据的修补标准库?
我发现 valgrind massif 已经非常有用了。我现在是这样使用它的:
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 控制台,并随时转储更多堆快照。启动后需要attach到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。
Heaptrack (http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux) 可用于此目的。 Valgrind 中的 Massif 工具也是如此。我已经成功地使用了两者。 您可能还想查看 libstdc++ 的调试模式 - https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html