Chicos, ¿podrían recomendar una herramienta para detectar una corrupción de memoria en un servidor multiproceso de producción creado con C++ y que funciona bajo Linux x86_64? Actualmente estoy enfrentando el siguiente problema: cada varias horas mi servidor se bloquea con un segfault y el volcado del núcleo muestra que el error ocurre en malloc/calloc, que es definitivamente un signo de que la memoria está corrupta en alguna parte.Corrupción de la corrupción de la información en un servidor de producción Linux
En realidad, ya he probado algunas herramientas sin mucha suerte. Aquí está mi experiencia hasta ahora:
Valgrind es un gran (incluso diría mejor) herramienta, sino que ralentiza el servidor demasiado lo que es inutilizable en la producción. Lo probé en un servidor de escenario y realmente me ayudó a encontrar algunos problemas relacionados con la memoria, pero incluso después de solucionarlos sigo teniendo bloqueos en el servidor de producción. Ejecuté mi servidor de escenario en Valgrind durante varias horas, pero aún no pude detectar ningún error grave.
Se dice que ElectricFence es una verdadera fuente de memoria, pero ni siquiera pude hacerlo funcionar correctamente. Se segfaults casi de inmediato en el servidor de escenario en lugares aleatorios al azar donde Valgrind no mostró ningún problema en absoluto. ¿Tal vez ElectricFence no admite el enhebrado? ... No tengo idea.
DUMA - la misma historia que ElectricFence pero aún peor. Mientras EF producía volcados centrales con backtraces legibles, DUMA solo me muestra "?????" (y sí, el servidor está construido con la bandera -g)
dmalloc - Configuré el servidor para usarlo en lugar del malloc estándar rutinas, sin embargo, se bloquea 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
le agradecería cualquier ayuda en este tema
actualización:?.. he conseguido encontrar la fuente del error sin embargo, me encontré en el servidor de etapa no producción uno usando helgrind/DRD/tsan - hubo una datarace entre varios hilos que resultó en memoria corrupta ion. La clave era usar supresiones de valgrind adecuadas ya que estas herramientas mostraban 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 ...
¿Compiló libefence en o usó LD_PRELOAD env variable? ElectricFence es seguro para hilos supuestamente si se compila con -DUSE_SEMAPHORE –
estoy usando libefense.a no .so. Y no lo compilé yo mismo, instalé usando emerge en Gentoo. ¿Recomendaría instalarlo manualmente con esta bandera? – pachanga
Una cosa que podría ayudar es buscar +/- 200 bytes de donde la falla seg dijo que los datos estaban corruptos. Al observar los datos, es posible que pueda hacerse una idea de lo que está causando la corrupción de la memoria. – steve