Si lo que desea es obtener la ubicación desde la que se solicita la gran cantidad de memoria, la manera más fácil sería para parchear malloc
función o crear una nueva biblioteca que tiene malloc
llamada y realizar un seguimiento del tamaño de formar su malloc function
. No estoy hablando de implementar la llamada malloc. LD_PRELOAD esta biblioteca a su aplicación.
aquí es un ejemplo de código:
/*
* 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);
}
Puede muy bien modificar este código para hacer algunas cosas adicionales.
Es para la memoria del montón. El código usa una gran cantidad de datos y necesito saber en qué función se está asignando. Aunque la desasignación puede ocurrir en otra función, si la función A asigna 16Gb y la máquina tiene 8Gb, la computadora comienza a intercambiar (y no importa si la función B posterior lo va a desasignar). – lezo
¿Por qué necesita asignar 16 G de memoria a la vez? Creo que deberías reconsiderar tu requerimiento y diseño. –
@ Vikram.exe - tiene razón, pero para responder a esa pregunta, necesita los resultados del generador de perfiles :-) (Recuerde: puede que esté manteniendo el código escrito por otra persona, e incluso si no, el comportamiento de la vida real) de los sistemas a menudo puede ser impredecible :-) – psmears