Если вы просто хотите, чтобы получить место, откуда большой объем памяти требуется, Проще всего было бы залатать 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);
}
Вы можете очень хорошо изменить этот код, чтобы сделать некоторые дополнительные вещи.
Это для памяти кучи. В коде используется большой объем данных, и мне нужно знать, в какой функции его выделяет. Хотя освобождение может выполняться в другой функции, если функция A выделяет 16 ГБ, а машина имеет 8 Гбит, компьютер начинает замену (и не имеет значения, будет ли позже функция В освободить его). – lezo
Почему вам нужно выделить 16-граммовую память, которую нужно выделить сразу? Я думаю, вы должны пересмотреть свои требования и дизайн. –
@ Vikram.exe - вы правы, но для того, чтобы ответить на этот вопрос, ему нужны результаты профилировщика :-) (Помните - он может поддерживать код, написанный кем-то другим, и даже если нет, реальное поведение систем часто может быть непредсказуемым :-) – psmears