resueltos punteros memoria manejo ejercicios dinamicos dinamica asignacion arreglos c memory-leak-detector

punteros - ¿Detectando fugas de memoria en los programas de C?



punteros en c (5)

Además de la respuesta de realloc llamadas en su código fuente, si está usando gnu ld , puede hacer que el vinculador ajuste todas las llamadas (presumiblemente a malloc , realloc , calloc y free ) en el momento del enlace, independientemente de dónde ellos vienen de. Luego escribe __wrap_malloc etc. y puede llamar a la función original con, por ejemplo, __real_malloc .

Consulte el --wrap=symbol en http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html

No sé cómo funciona esto con llamadas de bibliotecas compartidas. Supongo que no es así.

Si quisiéramos buscar fugas de memoria en un programa C ++, podemos sobrecargar los operadores new y delete para mantener un registro de la memoria asignada. ¿Qué pasa si nos gustaría comprobar si hay fugas en un programa de C? Como no hay sobrecarga de operadores en C, ¿podemos malloc puntero de la función malloc para interceptar llamadas a malloc y rastrear la asignación de memoria? ¿Hay una manera más fácil sin usar ninguna utilidad externa? Por favor, proporcione un código, ya que no estoy familiarizado con los punteros del método de sobrescritura.

Nota: Me gustaría hacer esto sin ninguna utilidad externa para la práctica.



Como se sugirió, ya existen excelentes herramientas como Valgrind para hacer esto.

Promover:

Me gustaría hacer esto sin ninguna utilidad externa para la práctica.
Esto es interesante y estoy seguro que estaría cumpliendo,
Puede usar el truco macro para detectar dicho uso de memoria y errores de fugas, de hecho, escriba su propio detector de fugas. Debe poder hacer esto siempre que tenga una única función de asignación y desasignación en su proyecto.

#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__) void* my_malloc(size_t size, const char *file, int line, const char *func) { void *p = malloc(size); printf ("Allocated = %s, %i, %s, %p[%li]/n", file, line, func, p, size); /*Link List functionality goes in here*/ return p; }

Usted mantiene una Lista enlazada de direcciones que se asignan con el archivo y el número de línea desde donde se asignaron. Actualizas la lista de enlaces con entradas en tu malloc .

De manera similar a lo anterior, puede escribir una implementación de forma free , en la que verifica las entradas de direcciones que se solicitan para ser liberadas en su lista vinculada. Si no hay una entrada coincidente, es un error de uso y puede marcarlo así.

Al final de su programa, imprime o escribe el contenido de su lista vinculada en un archivo de registro. Si no hay fugas, su lista enlazada no debería tener entradas, pero si hay algunas fugas, el archivo de registro le proporciona la ubicación exacta de donde se asignó la memoria.

Tenga en cuenta que al usar este truco macro, pierde la comprobación de tipos que ofrecen las funciones, pero es un truco pequeño que uso muchas veces.

Espero que esto ayude y todo lo mejor :)


Use la función mallinfo para Xilinx Zynq baremetal usando Xilinx SDK gcc. Probé con pérdida de memoria intencional. No tengo idea de por qué, pero los resultados de Google fueron increíblemente terribles al encontrar que esta solución corrió la voz para ayudar a otros desarrolladores.


Valgrind es lo que necesitas.

Recuerdo haber leído el primer capítulo de Algoritmos en una cáscara de nuez que habló sobre esto aunque no incluyó el código. Acabo de añadir en caso de que te resulte interesante.

ya que no hay sobrecarga de operadores en c, podemos sobrescribir la función malloc para interceptar llamadas a malloc y rastrear la asignación de memoria

En realidad, usted puede. Dale a LD_PRELOAD una lectura.