segfault solo cuando NO se usa el depurador

3 minutos de lectura

Tengo un programa C multiproceso, que genera constantemente una falla de segmentación en un punto específico del programa. Cuando lo ejecuto con gdb, no se muestra ninguna falla. ¿Puedes pensar en alguna razón por la cual la falla podría ocurrir solo cuando no se usa el depurador? ¡Es bastante molesto no poder usarlo para encontrar el problema!

  • Este tipo de error se llama “Heisenbug” y puede tener muchas causas.

    – Sven Marnach

    7 de enero de 2011 a las 17:47

  • ¿El error está relacionado con la administración de ventanas y/o User32.dll?

    – usuario541686

    7 de enero de 2011 a las 17:48

  • Tuve un problema como este, mi programa solo fallaba con GDB. El problema era que una variable de miembro de clase no inicializada todavía obtenía el valor 0 cuando ejecutaba mi programa, pero cuando lo ejecutaba en GDB tenía un valor enorme que fallaba cuando lo usaba como un índice de matriz.

    – GWW

    07/01/2011 a las 17:50

  • No relacionado con Windows: estoy usando Linux 2.6.32-24-generic #43-Ubuntu.

    – Benubird

    7 de enero de 2011 a las 17:53

  • ¿Ha intentado organizar un volcado del núcleo? Correr ulimit -c unlimited antes de iniciar el programa fuera del depurador, entonces gdb myprogram core después de que vuelca el núcleo. gdb podrá publicar autopsia su defecto de segmento.

    – Robie Basak

    7 de enero de 2011 a las 18:03

avatar de usuario
usuario541686

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. Es posible que los errores sensibles al tiempo, como las condiciones de carrera, no se reproduzcan cuando el programa se ralentiza mediante líneas fuente de un solo paso en el depurador. Esto es especialmente 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. Tratar (gdb) set disable-randomization off.

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

  • ¡’desactivar la aleatorización deshabilitada’ resolvió un problema similar para mí!

    – Marcus Johanson

    30 de junio de 2014 a las 7:30

Tal vez al usar gdb la memoria está asignada en una ubicación en la que su flujo excesivo/insuficiente no pisotea la memoria que provoca un bloqueo. O podría ser una condición de carrera que ya no se dispare. Aunque suene poco intuitivo, deberías estar contento su programa fue lo suficientemente bueno como para fallar en usted.

Algunas sugerencias

  1. Pruebe un analizador de código estático como el gratuito
    control de cpp
  2. Pruebe un depurador malloc() como
    defensa de la libertad
  3. Intenta ejecutarlo Valgrind

Al depurarlo, está cambiando el entorno en el que se está ejecutando. Parece que está lidiando con algún tipo de condición de carrera, y al depurarlo, 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 algún resultado de depuración en el código para ayudar a resolver el problema? Eso puede tener un impacto menor y permitirle encontrar su problema.

He tenido este problema totalmente antes! Era una condición de carrera, y cuando estaba revisando 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.

si estás usando gccintenta usar el -Wall opción para obtener todas las advertencias. Si usa un IDE como Eclipse, lo haría automáticamente.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad