如何追踪C++标准库调用的内存分配?

7

考虑这个简单的例子:

#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

是否可以精确追踪分配发生的位置(即哪个数据结构执行了分配以及何时执行)?


你试过massif吗? - m.s.
@m.s. 我刚刚试了一下,但输出结果还是一样的。 - syntagma
好的,谢谢。一开始输出的结果很难读懂,但看起来就是我要找的东西。 - syntagma
2
@REACHUS 请尝试使用massif-visualizer。 - edmz
1
作为 Massif 的替代方案,您也可以尝试使用 heaptrack - Fabio Fracassi
显示剩余2条评论
2个回答

2
跟踪C++库分配调用的正确方法是使用Massif,这是一个堆分析工具(Valgrind的一部分):
  1. 启用Massif运行Valgrind:

    valgrind --tool=massif

  2. 使用ms_print分析Massif的输出:

    ms_print massif.out.12345(数字会变化)


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接