2011-08-17 12 views
1

Я ищу инструмент, который поможет визуализировать использование памяти в приложении и показать, что использует большую часть памяти - то есть какие классы, сколько объектов и т. Д. Есть аналогичный thread, который обсуждает ту же проблему для Windows, но мне нужно сделать это на linux.Визуализация памяти для приложения C++ linux

+1

В теме, которую вы упомянули, обсуждается Valgrind, которая решает проблему –

ответ

3

Valgrind было бы нормально для Linux.

+0

Может ли это дать такую ​​информацию? Я просмотрел http://valgrind.org/docs/manual/ms-manual.html и видел только стек и кучу информации, а не многое другое ... – naumcho

+0

Valgrind - это основа для двоичной аппаратуры. Существует множество инструментов, сделанных с Valgrind, и вы всегда можете создавать свои собственные. Большинство людей распознают инструменты, распространяемые с Valgrind по умолчанию, в то время как это всего лишь несколько примеров из множества вариантов. :) –

1

Вы захотите использовать массив инструментов Valgrind (который документирован, с которым вы связались). Он периодически принимает моментальные снимки вашей кучи и создает полную трассировку стека, из которых строки кода отвечают за какой процент распределений кучи.

example.cpp:

struct Int_1 { int a; }; 
struct Int_2 { int a,b; }; 
struct Int_3 { int a,b,c; }; 
struct Int_4 { int a,b,c,d; }; 

int main(void) 
{ 
    for(int i = 0; i < 1000; ++i) 
    { 
     new Int_1(); // Line 10 
     new Int_2(); // Line 11 
     new Int_3(); // Line 12 
     new Int_4(); // Line 13 
    } 
    return 0; 
} 

Вы хотите скомпилировать его с отладочной, так что массив может дать вам точные цифры строки:

g++ -g example.cpp 

Теперь запустить его под Valgrind-массива:

valgrind --tool=massif ./a.out 

Это создаст файл massif.out.PID с периодическими снимками, которые выглядят следующим образом:

#----------- 
snapshot=59 
#----------- 
time=1487054 
mem_heap_B=38384 
mem_heap_extra_B=53752 
mem_stacks_B=0 
heap_tree=detailed 
n4: 38384 (heap allocation functions) malloc/new/new[], --alloc-fns, etc. 
n0: 15344 0x4005C3: main (MemExample.cpp:13) 
n0: 11520 0x4005B1: main (MemExample.cpp:12) 
n0: 7680 0x40059F: main (MemExample.cpp:11) 
n0: 3840 0x40058D: main (MemExample.cpp:10) 

Выходной сигнал интерпретируется как «В произвольной единицы времени 1487054, были 38384 байтов, выделенных в куче». Отступ представляет собой иерархическое разбиение тех 38348 байт, которые вы можете наблюдать пропорции, соответствующие их размерам. С более сложным кодом вы увидите целые цепочки вызовов, которые содержат больше методов и конструкторов.

Идея состоит в том, что количество байтов рядом с конструктором на этом выходе показывает, сколько экземпляров этого класса было выделено через эту конкретную трассировку стека, например: в строке 10 выделено 3840 байт, что является конструкцией объектов Int_1 поэтому на данный момент было 960 экземпляров.

+0

Раздел, который вы хотите внимательно прочитать в руководстве: http://valgrind.org/docs/manual/ms-manual.html#ms-manual.thesnapshotdetails – lnqhien

Смежные вопросы