Cómo rastrear / solucionar un problema relacionado con la memoria en un código C / C ++ grande en sistemas * nix

9

¿Qué estrategia usas al rastrear un problema relacionado con la memoria? ¿Qué herramientas utiliza (tanto de código abierto como patentadas) para identificar pérdidas de memoria, daños en la memoria, etc. ¿Cómo rastrearía las pérdidas de memoria si solo gdb / dbx estuviera disponible en un sistema?

Para mí, arreglar las pérdidas de memoria con solo un depurador es muy difícil.

Hemant
fuente
2
Personalmente, creo que esta pregunta está más relacionada con la programación que con Unix.
phunehehe

Respuestas:

12

Si puede cambiar el código fuente, Dmalloc es genial; enumerará qué punteros no fueron liberados y (para el código construido con símbolos de depuración) exactamente en qué línea se asignaron.

Si no puede, Valgrind es más o menos el estándar para ese tipo de cosas. En general, encuentro que Valgrind es algo más difícil de usar, pero tiene muchas más funciones y no implica agregar llamadas dmalloc a su código

Michael Mrozek
fuente
dmalloc no es muy eficiente como se esperaba en sistemas muy grandes. valgrind es una mejor apuesta, e incluso allí encontrarás cuellos de botella ...
valgrind --tool memcheck "yourapp" proporcionará información relacionada con la memoria en tiempo de ejecución (útil en sistemas de escritorio). Otra gran herramienta es memwatch, pero debe compilarse junto con su fuente. Memwatch puede registrar detalles en un archivo, por lo tanto, más adecuado para sistemas integrados.
rajaganesh87
7

Valgrind es increíblemente útil.

jacksonh
fuente
2

El macizo (de valgrind) es una de las mejores formas de encontrar pérdidas de memoria. Repita su código sospechoso (o ejecute su programa el tiempo suficiente) y descargue el resultado con ms_print. Por lo general, la pila de llamadas le brinda suficiente información para solucionarlo.

Con GDB, puede intentar conectarse a un programa en ejecución y llamar a funciones como malloc_stats()

Si su programa está escrito en un idioma diferente, podría ser más complicado. Recientemente, algunos GDB han ganado capacidad de scriptabilidad, y la gente comenzó proyectos interesantes como gdb-heap , que puede analizar la memoria de Python desde un volcado del núcleo. Scripts de análisis de memoria similares podrían ser posibles para objetos C ++.

Lea también /programming/2564752/examining-cc-heap-memory-statistics-in-gdb

elmarco
fuente
1

Para Solaris, hay varias herramientas enumeradas en las respuestas a esta pregunta de StackOverflow (incluyen la verificación de fugas con otras formas de mal acceso a la memoria).

alanc
fuente
1

He estado haciendo Objective-C durante algún tiempo, y hay un analizador que se ocupa de la administración de memoria de nivel C y cosas así. Clang Static Analyzer es tan bueno que Apple decidió agruparlo con su xCode IDE. No estoy seguro de si esto es bueno para su pregunta, pero si está haciendo C, entonces vale la pena intentarlo.

phunehehe
fuente
Pequeñas objeciones: clang fue desarrollado para su uso en xcode desde el principio. Ver clang.llvm.org/clang_video-05-25-2007.html
Daniel James
Hola Daniel, eso podría ser cierto, pero no se incluyó en xCode hasta hace poco (o al menos no en el paquete que descargué de Apple)
phunehehe