c++ - dumped - Segfaults en malloc() y malloc_consolidate()
segmentation fault(core dumped) php (2)
De http://www.gnu.org/s/libc/manual/html_node/Heap-Consistency-Checking.html#Heap-Consistency-Checking :
Otra posibilidad de verificar y protegerse contra errores en el uso de malloc, realloc y free es establecer la variable de entorno MALLOC_CHECK_. Cuando se establece MALLOC_CHECK_, se utiliza una implementación especial (menos eficiente) que está diseñada para tolerar errores simples, como llamadas dobles de forma gratuita con el mismo argumento, o sobrepases de un solo byte (errores uno por uno). Sin embargo, no todos los errores pueden protegerse y pueden producirse pérdidas de memoria. Si MALLOC_CHECK_ se establece en 0, cualquier corrupción detectada en el montón se ignora silenciosamente; si se establece en 1, se imprime un diagnóstico en stderr; si se establece en 2, se invoca abortar inmediatamente. Esto puede ser útil porque de lo contrario un bloqueo puede ocurrir mucho más tarde, y la verdadera causa del problema es muy difícil de rastrear.
Mi aplicación segfaults a veces y principalmente en malloc () y malloc_consolidate () cuando miro la traza inversa en gdb.
Comprobé que la máquina tiene suficiente memoria disponible, ni siquiera comenzó a intercambiarse. Comprobé los ulimits para la segmentación de datos y el tamaño máximo de la memoria, y ambos están configurados en ''ilimitado''. También ejecuté la aplicación bajo valgrind y no encontré ningún error de memoria.
Ahora estoy sin ideas, qué más podría estar causando estos segfaults. Algunas ideas ?
Actualización: dado que no encuentro nada con valgrind (o ptrcheck), ¿podría ser que otra aplicación está destruyendo la estructura de memoria de libc o hay una estructura separada para cada proceso?
Lo más probable es que estés destrozando el montón, es decir, estás escribiendo más allá de los límites de una pieza de memoria que asignaste, y esto está sobrescribiendo las estructuras de datos que usa malloc()
para administrar el montón. Esto hace que malloc()
acceda a una dirección no válida y tu aplicación falla.
Quedando sin memoria no causaría que malloc()
bloquee, simplemente devolvería NULL
. Eso podría hacer que tu código se bloquee si no estás buscando NULL
, pero el sitio del bloqueo no estaría en malloc()
.
Es un poco extraño que Valgrind no reporte ningún error, pero hay algunos errores que la herramienta "Memcheck" predeterminada puede perderse. Intenta ejecutar Valgrid con la herramienta "Ptrcheck" en su lugar.