Tengo un programa multiproceso C, que consistentemente genera un error 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!segfault solo cuando NO estoy usando depurador
Respuesta
Classic Heisenbug. De 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, ulimit -c unlimited
y la depuración post mortem (ya sugerido por Robie) pueden funcionar.
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 encuentre 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.
Quizás cuando se utiliza gdb
, la memoria se asigna en una ubicación en la que el flujo excesivo o descendente no afecta la memoria que causa un bloqueo. O podría ser una condición de carrera que ya no se dispare. Aunque suena poco intuitivo, debe ser feliz su programa fue lo suficientemente agradable como para chocar con usted.
Algunas sugerencias
I ¡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.
- 1. No entiendo completamente scrollRectToVisible cuando estoy usando contentInset
- 2. .lib error cuando estoy usando un dll?
- 3. ¿Estoy usando CNCopyCurrentNetworkInfo correctamente?
- 4. ¿Cómo puedo saber si estoy en el depurador en Android?
- 5. No se puede conectar a Glassfish usando cualquier depurador
- 6. ¿Estoy usando listas correctamente?
- 7. ¿Estoy usando super() correctamente?
- 8. segfault con strcmp
- 9. error "eglConfig no inicializado", pero no estoy usando openGl
- 10. Inicialización de Python segfault
- 11. ¿Por qué estas animaciones no funcionan cuando estoy usando un guión gráfico?
- 12. ¿Estoy usando plátano reactivo, verdad?
- 13. ¿Por qué mi código no se segfault en Windows 7?
- 14. depurador no funcionará con JMockit
- 15. ExceptionConverter: java.io.IOException: el documento no tiene páginas. estoy usando iText
- 16. colgar y/o segfault al usar boost :: threads desde matlab, no cuando se llama directamente
- 17. Obtiene el error SQLite usando heroku db: push cuando estoy usando PostgreSQL como desarrollo db
- 18. Usando el depurador remoto Eclipse tiros com.sun.jdi.InternalException
- 19. ¿Qué versión de C++ estoy usando?
- 20. Encender la optimización de g ++ causa segfault - No lo entiendo
- 21. Depurador de Eclipse: salte o muestre solo el hilo suspendido
- 22. segfault en el vector <struct>
- 23. std :: string :: assign() causa segfault
- 24. ¿Qué debo pasar para el encabezado WWW-Authenticate en 401 si solo estoy usando OpenID?
- 25. principal recursivo(): ¿por qué segfault?
- 26. ¿Estoy registrando el ObjectContext usando AutoFac correctamente?
- 27. Estoy usando tinymce, ¿es posible solicitar solo un área de texto
- 28. ¿Cuándo debo hacer una clase Moose inmutable cuando estoy realmente usando -> meta?
- 29. casting char [] [] a char ** provoca segfault?
- 30. ¿Cómo manejo las evoluciones de la base de datos cuando estoy usando JPA?
Este tipo de error se llama ["Heisenbug"] (http://en.wikipedia.org/wiki/Heisenbug#Heisenbug) y puede tener muchas causas. –
¿El error está relacionado con la gestión de ventanas y/o User32.dll? – Mehrdad
Tuve un problema como este, mi programa solo se bloqueó con GDB. El problema era que una variable miembro no clasificada aún obtenía el valor 0 cuando ejecuté mi programa, pero cuando lo ejecuté en GDB tenía un gran valor que segfaulted cuando lo usaba como un índice de matriz. – GWW