segfault solo cuando NO usas depurador
debugging gdb (4)
Tengo un programa C multiproceso, que consistentemente genera una falla de segmentación en un punto específico del programa. Cuando lo ejecuto con gdb, no se muestra ningún error. ¿Puede pensar en alguna razón por la cual la falla puede ocurrir solo cuando no se usa el depurador? ¡Es bastante molesto no poder usarlo para encontrar el problema!
¡He tenido este problema por completo antes! Era una condición de carrera, y cuando estaba pisando el código con un depurador, el hilo en el que estaba era lo suficientemente lento como para no activar la condición de carrera. Bastante malo.
Al depurarlo, está cambiando el entorno en el que se está ejecutando. Parece que está tratando con algún tipo de condición de carrera, y al depurarlo las cosas se programan de forma ligeramente diferente para que no se encuentre con el problema. Eso o las cosas se almacenan de una manera ligeramente diferente para que no ocurra. ¿Puedes poner algo de depuración en el código para ayudar a resolver el problema? Eso puede tener un impacto menor y permitirle encontrar su problema.
Tal vez cuando se usa la memoria gdb
se mapea en una ubicación en la que su flujo de sobre / bajo no se arrolla en la memoria que causa un bloqueo. O podría ser una condición de carrera que ya no se dispare. Aunque parezca poco intuitivo, debería alegrarse de que su programa haya sido lo suficientemente bueno como para chocar con usted.
Algunas sugerencias
Heisenbug clásico. De la Wikipedia:
El tiempo también puede ser un factor en heisenbugs. Ejecutar un programa bajo el control de un depurador puede cambiar el tiempo de ejecución del programa en comparación con la ejecución normal. Los errores sensibles al tiempo, como las condiciones de carrera, pueden no reproducirse cuando el programa se ralentiza mediante líneas fuente de paso único en el depurador. Esto es particularmente cierto cuando el comportamiento implica la interacción con una entidad que no está bajo el control de un depurador, como cuando se depura el procesamiento de paquetes de red entre dos máquinas y solo una está bajo el control del depurador.
El depurador puede estar cambiando el tiempo y ocultando una condición de carrera.
En Linux, GDB también deshabilita la aleatorización del espacio de direcciones, y su bloqueo puede ser específico para el diseño del espacio de direcciones. Pruebe (gdb) set disable-randomization off
.
Finalmente, la depuración ulimit -c unlimited
y post mortem (ya sugerida por Robie) puede funcionar.