elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Depurar la asignacion de memoria.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Depurar la asignacion de memoria.  (Leído 1,671 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Depurar la asignacion de memoria.
« en: 18 Mayo 2016, 23:54 pm »

La idea es depurar la asignacion de momeria.

Tengo un programa algo grande que necestito depurar. El programa usa memoria dinamica todo el tiempo y en general el programa funciona bien.

Sin embargo segun mis calculos el programa esa usando mas memoria de la que necesita. Algunos megas de mas  :laugh: :laugh:

Reemplace las llamadas a free, malloc y calloc por unas funciones para ir depurando cada que se reserva o libera memoria.

¿Alguno de ustedes ha hecho algo parecido?

¿Alguna sugerencia algun cambio?

Tengo el siguiente codigo:

Código
  1.  
  2. char **punteros;
  3. size_t *contador_size;
  4. size_t offset_contador = 0;
  5. size_t contador_memoria = 0;
  6.  
  7. void _free_( char *ptr) {
  8. remove_contador(ptr);
  9. free(ptr);
  10. }
  11.  
  12. char *_calloc_(size_t nmemb, size_t size) {
  13. char *ptr;
  14. ptr = calloc(nmemb,size);
  15. add_contador(ptr,nmemb*size);
  16. return ptr;
  17. }
  18. void add_contador(char *ptr,size_t size) {
  19. printf("add_contador: %u [0x%x] %u + %u bytes\n",offset_contador,ptr,contador_memoria,size);
  20. punteros = realloc(punteros,(offset_contador+1)*sizeof(char*));
  21. contador_size = realloc(contador_size,(offset_contador+1)*sizeof(size_t));
  22. punteros[offset_contador] = ptr;
  23. contador_size[offset_contador] = size;
  24. contador_memoria+=size;
  25. offset_contador++;
  26. }
  27.  
  28. void remove_contador(char *ptr) {
  29. size_t i = 0;
  30. while(punteros[i] != ptr && i < offset_contador) {
  31. i++;
  32. }
  33. printf("remove_contador: %u [0x%x]\n",i,ptr);
  34. contador_memoria-=contador_size[i];
  35. while(i < offset_contador-1) {
  36. punteros[i] = punteros[i+1];
  37. contador_size[i] = contador_size[i+1];
  38. i++;
  39. }
  40. punteros[i] = NULL;
  41. contador_size[i] = 0;
  42. offset_contador--;
  43. }

Al final solo tenemos que validar la variable contador_memoria para saber cuantos bytes quedan y offset_contador para saber cuantos apuntadore quedan.

Saludos


En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: Depurar la asignacion de memoria.
« Respuesta #1 en: 19 Mayo 2016, 00:28 am »

Por lo que entiendo quieres mirar los memory leaks? en ese caso puedes usar el flag "-fsanitizer=address" en gcc-4.9 o superior (creo), sino también puedes probar con valgrind.

Este método tuyo me recuerda a lo que hace mtrace (https://en.wikipedia.org/wiki/Mtrace)



« Última modificación: 19 Mayo 2016, 00:29 am por Stakewinner00 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Asignación de memoria en C
Programación C/C++
Akkon 3 4,108 Último mensaje 30 Abril 2011, 15:22 pm
por Akkon
Asignacion Dinamica Memoria
Programación C/C++
charmedever 5 3,730 Último mensaje 21 Octubre 2011, 05:25 am
por charmedever
asignacion dinamica de memoria
Programación C/C++
d91 2 2,462 Último mensaje 1 Junio 2014, 05:09 am
por Drewermerc
Como puedo depurar un fallo de asignacion de memoria en C++??? « 1 2 3 4 »
Programación C/C++
kafok 37 14,265 Último mensaje 6 Diciembre 2014, 10:36 am
por Eternal Idol
Asignacion de memoria virtual
Programación C/C++
dokomaster 0 1,855 Último mensaje 10 Septiembre 2016, 02:28 am
por dokomaster
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines