2011-01-04 5 views
8

Мне нужен профилировщик памяти, чтобы знать использование памяти для каждой функции. Я знаю valgrind (Massif), но он не дает мне информации о конкретных функциях (по крайней мере, я не знаю, как это сделать с массивом)Профилировщик памяти для C

Знаете ли вы, что для этого в Linux?

Спасибо!

+0

Это для памяти кучи. В коде используется большой объем данных, и мне нужно знать, в какой функции его выделяет. Хотя освобождение может выполняться в другой функции, если функция A выделяет 16 ГБ, а машина имеет 8 Гбит, компьютер начинает замену (и не имеет значения, будет ли позже функция В освободить его). – lezo

+0

Почему вам нужно выделить 16-граммовую память, которую нужно выделить сразу? Я думаю, вы должны пересмотреть свои требования и дизайн. –

+1

@ Vikram.exe - вы правы, но для того, чтобы ответить на этот вопрос, ему нужны результаты профилировщика :-) (Помните - он может поддерживать код, написанный кем-то другим, и даже если нет, реальное поведение систем часто может быть непредсказуемым :-) – psmears

ответ

4

Возможно, вы захотите взглянуть на MemProf.

+0

спасибо! это хорошее решение! – lezo

4

Если вы просто хотите, чтобы получить место, откуда большой объем памяти требуется, Проще всего было бы залатать malloc функцию или создать новую библиотеку, имеющую malloc вызова и отслеживать размер формирует ваш malloc function. Я не говорю о реализации вызова malloc. LD_PRELOAD эту библиотеку для вашего приложения.

здесь пример кода:

/* 
* gcc -shared -fPIC foo.c -ldl -Wl,-init,init_lib -o libfoo.so 
* 
* LD_PRELOAD this library in the environment of the target executable 
* 
*/ 

#include <stdio.h> 
#include <sys/time.h> 
#include <dlfcn.h> 
#include <stdlib.h> 
#include <sys/errno.h> 

#ifndef RTLD_NEXT 
#define RTLD_NEXT ((void *)-1) 
#endif 

int init_lib(void) 
{ 
    return 0; 
} 

void *malloc(size_t size) 
{ 
    /* do required checks on size here */ 

    return ((void* (*)(size_t))(dlsym(RTLD_NEXT, "malloc")))(size); 
} 

Вы можете очень хорошо изменить этот код, чтобы сделать некоторые дополнительные вещи.

+1

Кто бы ни проголосовал, не могли бы вы объяснить причину? –

+1

Я поддерживаю, потому что это далеко не так. – jweyrich

+1

Спасибо Jweyrich, но я все еще удивляюсь, почему это было проголосовано. –

3

Massifделает показать вам, какие функции были ответственны за использование памяти, до тех пор, как вы собрали свою программу с отладочной информацией (-g). Он даже покажет вам номер строки.

Эта информация дается в качестве дерева вызовов в каждом подробный снимок по графику в формате ms_print. Частоту подробных снимков можно контролировать с помощью опции --detailed-freq для массива. См. Section 9.2.6 of the Massif manual для получения подробной информации о чтении подробной информации моментального снимка.

+0

Информатизация не слишком дружелюбна (как обычно в valgrind), но это правда, что она предоставляет информацию о функциях. Существует инструмент (massif visualizer http://kde-apps.org/content/show.php/Massif+Visualizer?content=122409), который, кажется, решает эту проблему с помощью красочной графики. Я еще не пробовал, но он отлично смотрится на скриншотах! – lezo

2

Как указывали другие, Massif дает исчерпывающую информацию для профилирования, но это значительно замедляет процесс.

Другим вариантом является tcmalloc от Google, который имеет встроенный профилировщик кучи, который выгружает граф вызовов с помощью распределений (см. http://goog-perftools.sourceforge.net/doc/heap_profiler.html), которые также могут быть визуализированы графически.

Вы можете связать его во время выполнения с вашей программой с помощью LD_PRELOAD, а переменная env HEAPPROFILE разрешает использование кучного профилировщика.

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