error de segmento solo cuando NO se utiliza el depurador


Tengo un programa C multiproceso, que genera consistentemente un fallo de segmentación en un punto específico del programa. Cuando lo corro con gdb, no se muestra ningún fallo. ¿Se le ocurre alguna razón por la que la falla podría ocurrir solo cuando no se utiliza el depurador? ¡Es bastante molesto no poder usarlo para encontrar el problema!

Author: Benubird, 2011-01-07

4 answers

Clásico Heisenbug . De Wikipedia:

El tiempo también puede ser un factor en heisenbugs. La ejecución de 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 por líneas de origen de un solo paso 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 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. Intenta (gdb) set disable-randomization off.

Finalmente, ulimit -c unlimited y la depuración post-mortem (ya sugerida por Robie) pueden funcionar.

 66
Author: Mehrdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-08 19:14:41

Tal vez cuando se usa gdb la memoria se asigna a una ubicación en la que su flujo superior/inferior no pisotea la memoria que causa un bloqueo. O podría ser una condición de carrera que ya no se tropieza. A pesar de que suena poco intuitivo, usted debe ser feliz su programa fue lo suficientemente bueno para estrellarse en usted.

Algunas sugerencias

  1. Pruebe un analizador de código estático como el free cppcheck
  2. Prueba un depurador malloc() como libefence
  3. Intenta ejecutarlo valgrind
 6
Author: SiegeX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-07 17:48:46

Al depurarlo, está cambiando el entorno en el que se está ejecutando. Suena como si estuviera tratando con algún tipo de condición de carrera, y al depurar las cosas se programan de manera ligeramente diferente para que no encuentre el problema. Eso, o las cosas se almacenan de una manera ligeramente diferente para que no ocurra. ¿Puede poner alguna salida de depuración en el código para ayudar a resolver el problema? Eso puede tener menos impacto y permitirle encontrar su problema.

 4
Author: Mark Loeser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-07 17:46:46

He tenido totalmente este problema antes! Era una condición de carrera, y cuando estaba pisando el código con un depurador, el subproceso en el que estaba era lo suficientemente lento como para no activar la condición de carrera. Bastante horrible.

 1
Author: rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-07 20:49:28