如何跟踪 C++ 标准库调用的内存分配?
How can I track memory allocation of C++ standard library calls?
考虑这个简单的例子:
#include <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <random>
#include <vector>
#include <iterator>
int main()
{
std::list<int> l(10);
std::iota(l.begin(),l.end(),77);
std::vector<std::list<int>::iterator> v(l.size());
std::iota(v.begin(), v.end(), l.begin());
std::vector<int> dest;
std::copy_if(l.begin(), l.end(), std::back_inserter(dest), [](int i){return i%2==1;});
for(auto n : dest)
std::cout << n << " ";
return 0;
}
当在 Valgrind 下 运行 时,它给我以下输出:
==27353== total heap usage: 15 allocs, 15 frees, 380 bytes allocated
是否可以准确跟踪这些分配发生的位置(即哪个数据结构执行分配以及确切时间)?
尝试为 valgrind 提供 --keep-stacktraces=alloc
选项。请注意,使用该选项会增加使用 valgrind 的开销。这是文档 http://valgrind.org/docs/manual/mc-manual.html#mc-manual.options,因此您可以微调 valgrind 捕获的内容。
跟踪 C++ 库分配调用的正确方法是使用 Massif,一种堆分析器工具(Valgrind 的一部分):
运行 启用 Massif 的 Valgrind:
valgrind --tool=massif
使用ms_print
分析Massif的输出:
ms_print massif.out.12345 (number varies)
考虑这个简单的例子:
#include <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <random>
#include <vector>
#include <iterator>
int main()
{
std::list<int> l(10);
std::iota(l.begin(),l.end(),77);
std::vector<std::list<int>::iterator> v(l.size());
std::iota(v.begin(), v.end(), l.begin());
std::vector<int> dest;
std::copy_if(l.begin(), l.end(), std::back_inserter(dest), [](int i){return i%2==1;});
for(auto n : dest)
std::cout << n << " ";
return 0;
}
当在 Valgrind 下 运行 时,它给我以下输出:
==27353== total heap usage: 15 allocs, 15 frees, 380 bytes allocated
是否可以准确跟踪这些分配发生的位置(即哪个数据结构执行分配以及确切时间)?
尝试为 valgrind 提供 --keep-stacktraces=alloc
选项。请注意,使用该选项会增加使用 valgrind 的开销。这是文档 http://valgrind.org/docs/manual/mc-manual.html#mc-manual.options,因此您可以微调 valgrind 捕获的内容。
跟踪 C++ 库分配调用的正确方法是使用 Massif,一种堆分析器工具(Valgrind 的一部分):
运行 启用 Massif 的 Valgrind:
valgrind --tool=massif
使用
ms_print
分析Massif的输出:ms_print massif.out.12345 (number varies)