es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué Valgrind señala una fuga de memoria en libc-start.c?

Después de construir una aplicación, esta sigue fallando debido a una fuga de memoria. El comienzo del informe de valgrind dice:

==70588==
==70588== RESUMEN DE LA HEAP:
==70588== en uso en la salida: 215.842 bytes en 2.327 bloques
==70588== uso total de la heap: 77.289 asignaciones, 74.962 liberaciones, 7.513.045 bytes asignados
==70588==
==70588== 20 bytes en 1 bloque se han perdido definitivamente en el registro de pérdidas 182 de 510
==70588== en 0x4849D8C: malloc (en /usr/lib/aarch64-linux-gnu/valgrid/vgpreload_memcheck-arm64-linux.so)
==70588== en 0x15481F: ??? (en /usr/bin/tcsh)
==70588== en 0x15C313: ??? (en /usr/bin/tcsh)
==70588== en 0x117EAB: ??? (en /usr/bin/tcsh)
==70588== en 0x492C08F: (por debajo de main) (libc-start.c:308)

Un mensaje similar se repite para varios registros, pero lo curioso es que siempre señala a libc-start.c, lo cual no proporciona mucha información sobre qué parte de la aplicación está causando la fuga de memoria (la propia aplicación tiene decenas de miles de líneas con una mezcla de C/Fortran y muchas dependencias internas). Cualquier sugerencia sobre cuál podría ser la raíz del problema o qué buscar sería bienvenida.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Según el informe de valgrind, parece que la aplicación tiene un problema significativo de fuga de memoria. El informe muestra que se han perdido 20 bytes en el registro de pérdidas 182 de 510, y esto se repite en varios registros. Sin embargo, la fuente de la fuga de memoria no está clara ya que siempre apunta a libc-start.c, lo cual no es útil.

    Para identificar la causa raíz de la fuga de memoria, se recomienda utilizar herramientas de valgrind como callgrind y massif para reducir la búsqueda de la fuente de la fuga. Callgrind se puede utilizar para identificar qué funciones están asignando y desasignando memoria, mientras que massif puede proporcionar detalles sobre cuánta memoria está utilizando cada función. Otra opción es utilizar la opción “–trace-children=yes” al ejecutar valgrind para rastrear todos los procesos secundarios que podrían estar causando fugas de memoria.

    Además, podría ser útil revisar el código y buscar áreas potenciales donde la memoria no se está liberando correctamente, como cuando se asigna memoria usando malloc o new y no se libera usando free o delete. También es importante asegurarse de que se libere toda la memoria asignada, incluso en condiciones de error, y considerar el uso de punteros inteligentes para gestionar la memoria automáticamente.

    En resumen, para encontrar la fuente de la fuga de memoria, se recomienda utilizar las herramientas de valgrind, revisar el código y asegurarse de que toda la memoria asignada se libere correctamente.

Comments are closed.