2015-06-18 28 views
7

考慮一個簡單的例子:如何跟蹤C++標準庫調用的內存分配?

#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 

是否有可能追蹤正是那些allocs發生(即,數據結構進行分配什麼時候到)?

+0

你試過[massif](http://valgrind.org/docs/manual/ms-manual.html)嗎? –

+0

@ m.s。我只是做了,但輸出是一樣的。 – syntagma

+0

運行'valgrind --tool = massif'後需要運行'ms_print massif.out.12345'(數字不同)。 –

回答

2

正確的方法來跟蹤C++庫分配調用是使用Massif,堆分析器工具(Valgrind的部分):

  1. 運行Valgrind的與地塊啓用:

    valgrind --tool=massif

  2. 使用ms_print來分析來自地塊的輸出:

    ms_print massif.out.12345 (number varies)