Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 18 Mayo 2016, 23:54 pm



Título: Depurar la asignacion de memoria.
Publicado por: AlbertoBSD 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


Título: Re: Depurar la asignacion de memoria.
Publicado por: Stakewinner00 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)