Pregunta

Chicos, ¿podría recomendar una herramienta para la detección de una corrupción de memoria en el servidor multiproceso de producción integrada con C ++ y funciona bajo Linux x86_64? Actualmente estoy frente al siguiente problema:. cada varias horas mi servidor se bloquea con un error de segmentación y el vaciado de memoria muestra que sucede error en malloc / calloc que es sin duda un signo de la memoria se alteren algún lugar

En realidad, yo he intentado ya algunas herramientas sin mucha suerte. Aquí está mi experiencia hasta ahora:

  • Valgrind es una herramienta genial (incluso diría que el mejor) pero ralentiza el servidor demasiado lo que es inutilizable en la producción. Lo probé en un servidor de etapa y lo que realmente me ayudó a encontrar algunos problemas relacionados con la memoria, pero incluso después de la fijación de ellos sigo teniendo accidentes en el servidor de producción. Me encontré con mi servidor de etapa bajo Valgrind durante varias horas, pero todavía no podía detectar los errores graves.

  • ElectricFence se dice que es un cerdo de memoria real, pero ni siquiera podía conseguir que funcione correctamente. Se segfaults casi inmediatamente en el servidor de etapa en lugares extraños al azar, donde Valgrind no mostró ningún problema en absoluto. Tal vez ElectricFence no soporta enhebrar bien? .. no tengo ni idea.

  • DUMA - misma historia que ElectricFence pero aún peor. Mientras EF produjo volcados de memoria con trazas legibles DUMA me muestra única "?????" (y sí servidor está construido con la bandera -g seguro)

  • Dmalloc - He configurado el servidor para usarlo en lugar de malloc rutinas estándar, sin embargo se cuelga después de varios minutos. Colocación de un GDB al proceso revela que está colgado en algún lugar de Dmalloc: (

Me estoy poniendo poco a poco loco y simplemente no saben qué hacer a continuación. He las siguientes herramientas para ser juzgado: mtrace, mpatrol pero tal vez alguien tiene una idea mejor

?

Te agradecería enormemente cualquier ayuda en este tema.

Actualización: Me las arreglé para encontrar la fuente del error. Sin embargo, me encontré en el servidor de etapa no la producción de uno usando Helgrind / DRD / tsan - hubo una Datarace entre varios hilos que se tradujo en una corrupción de memoria. La clave era utilizar supresiones valgrind apropiados, puesto que estas herramientas mostraron demasiados falsos positivos. Todavía no se sabe muy bien cómo esto puede ser descubierto en el servidor de producción sin ningún tipo de retrasos significativos ...

¿Fue útil?

Solución 3

La gente, me las arreglé para encontrar la fuente del error. Sin embargo, me encontré en el servidor de etapa usando Helgrind / DRD / tsan - hubo una Datarace entre varios hilos que se tradujo en una corrupción de memoria. La clave era utilizar adecuada supresiones valgrind desde estas herramientas mostraron demasiados falsos positivos. Todavía no se sabe muy bien cómo esto puede ser descubierto en el servidor de producción sin ningún tipo de retrasos significativos ...

Otros consejos

Sí, C / C ++ problemas de corrupción de memoria son difíciles. También utilicé varias veces valgrind, a veces se reveló el problema ya veces no.

Si bien el examen de salida de valgrind no tienden a ignorar su resultado demasiado rápido. A veces, después pasó un tiempo considerable, se verá que valgrind que dio la pista en el primer lugar, pero lo ignoró.

Otro consejo es comparar los cambios en el código de versión estable previamente conocido. No es un problema si se utiliza algún tipo de sistema de control de versiones de origen (por ejemplo, SVN). Examinar todas las funciones relacionadas con la memoria (por ejemplo memcpy, memset, sprintf, nuevo, eliminar / borrar []).

Compilar el programa con gcc 4.1 y el -fstack-protector-todos los conmutadores. Si la corrupción de la memoria es causada por la pila rompiendo esto debería ser capaz de detectarlo. Puede que tenga que jugar con algunos de los parámetros adicionales del SSP.

¿Ha tratado -fmudflap ? (Desplazarse hacia arriba unas pocas líneas para ver las opciones disponibles).

IBM puede intentar purificar, pero me temo que no es de código abierto ..

Los Google perftools --- que está abierto Fuente: --- pueden ser de ayuda, consulte el montón corrector documentación .

Prueba con esto: http://www.hexco.de/rmdebug/ I utilizado ampliamente, su tiene un bajo impacto en el rendimiento (en su mayoría impactos cantidad de RAM), pero el algoritmo de asignación es el mismo. Siempre es probado lo suficiente para encontrar cualquier error de asignación. Su programa se colgará en cuanto se produce el error, y que tendrá un registro detallado.

No estoy seguro de si hubiera cogido su error en particular, pero la variable de entorno MALLOC_CHECK_ ( malloc página del manual ) se activa una comprobación adicional en la ejecución malloc Linux por defecto, y por lo general no tiene un costo significativo en tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top