¿Qué es una falla de segmentación?

27

En Ubuntu me he enfrentado al error de falla de segmentación muchas veces. ¿Qué es una falla de segmentación y cuándo ocurre?

Taquiones
fuente
1
Solo para encubrirlo: tuve un problema similar, mientras que mis segfaults no eran reproducibles de manera confiable y provenían de aplicaciones (casi) aleatorias. Descubrí que lo más probable es que mi memoria esté rota. Entonces, si cualquier programa causa segfaults, uno podría echar un vistazo más de cerca a la RAM.

Respuestas:

25

Un error que indica un fallo de segmentación (o segfault , o SIGSEGV ) en Ubuntu y otros sistemas operativos similares a Unix, o un fallo de protección general en Windows, es cuando un programa intenta acceder a una parte de la memoria a la que no se puede acceder, o al que el programa tiene prohibido el acceso. Una falla de segmentación es un tipo de bloqueo del programa, es decir, una terminación anormal de un programa. Ver los artículos de Wikipedia sobre accidentes , protección de memoria , error de segmentación , error de protección general , y SIGSEGV para obtener más información (y una comprensión más textura del tema que se presenta aquí).

Una falla de segmentación casi siempre se debe a un error en el programa donde ocurre. Supongo que la mayoría o todas sus fallas de segmentación están ocurriendo desde la misma aplicación. Proporcione más detalles sobre las circunstancias bajo las cuales ocurren fallas de segmentación en su máquina y qué programa se está bloqueando. Proporcione también el texto completo y exacto del mensaje de error que está recibiendo y cualquier otro mensaje que aparezca antes. Esto debería permitirnos proporcionar consejos detallados específicos para su problema (en lugar de solo información general sobre qué es una falla de segmentación).

La mejor manera de proporcionar esta información es editar su pregunta para incluirla . Alternativamente, si desea que esta pregunta sea solo sobre fallas de segmentación en general, puede publicar una nueva pregunta para preguntar qué está causando específicamente sus fallas de segmentación (si hace esto, asegúrese de proporcionar todos estos detalles en su nueva pregunta) .

Eliah Kagan
fuente
Afortunadamente, todos los errores de segmentación se corrigen actualizando os :). Mi pregunta es sobre la falla de segmentación en general. No para una aplicación en particular.
Tachyons
@ No soy esta persona. He editado mi respuesta en consecuencia. (Retengo las instrucciones para proporcionar más información, en beneficio de otros usuarios que experimentan fallas de segmentación, aunque sé que no necesita asistencia específica con ellos en este momento).
Eliah Kagan
Bueno, esto se trata de un fallo de segmentación en una aplicación. Quería preguntar si ocurre en un programa C ++ donde el mismo programa funciona perfectamente bien en Windows o Turbo C ++ (en vino) (uso anjuta en Linux). Y estos son solo programas básicos y no aplicaciones (Programas como TREES , GRÁFICOS, etc.)
Nirmik
Gracias. Pero me temo que en la mayoría de los casos, hacer preguntas sobre la falla de segmentación en la aplicación es un tema poco aquí. :)
Tachyons
@Nirmik: probablemente es el tema de stackoverflow :)
Tachyons
4

La falla de segmentación es causada por un error en la aplicación. Técnicamente significa que la aplicación intenta leer o escribir en una parte de la memoria que no le pertenece (o que no existe). Por supuesto, está prohibido leer o escribir en la memoria de otra persona y cuando el sistema (kernel) detecta esto, obligará a la aplicación a cerrar.

Vojtech Trefny
fuente
0

Atrás quedaron los días en que las personas solían rastrear el código de ensamblaje y depurar un problema. Abends, Dr. Watson, Falla de segmentación. Esos días verdes se han ido.

Una de las razones de una falla de segmentación es cuando falla el código que tiene acceso directo a la memoria. Cuando un fragmento de código intenta acceder al segmento de memoria de una aplicación diferente, se produce un fallo de segmentación. Algunas veces, las asignaciones de memoria se mueven para permitir que se asignen bloques contiguos de memoria más grandes. Mientras intenta recuperarse, el núcleo se esfuerza por guardar toda su información de memoria en un archivo, el estado actual de todas las aplicaciones que se ejecutan en la CPU y su estado (última instrucción ejecutada) en un archivo y simplemente muere. También intentará almacenar tanta información de recuperación y cerrar tantos archivos como sea posible, para que los discos duros no obtengan enlaces rotos.

Depúrelo y corríjalo si puede reproducirlo con frecuencia. Si no puedes reproducirlo, solo une tus manos, arrodíllate y reza como el infierno para que no lo veas "regularmente".

Siddharth
fuente
Los segfaults se pueden activar en cualquier programa escrito en un idioma que permita el acceso directo a la memoria. Por lo general, tampoco bloquean el núcleo.
Alex L.
@AlexL. Eso es exacto. Editaré mi respuesta.
Siddharth
Espero haber representado mis pensamientos correctamente.
Siddharth
@AlexL. ¿Puedes por favor revisarlo una vez más? Lo eliminaré, si aún no es exacto.
Siddharth
Este es mejor. Aún así, (1) aunque es posible, es extremadamente raro que un programa configure el SIGSEGVcontrolador en otra cosa que no sea SIG_DFL(que es volcar el núcleo y salir por a SIGSEGV) ya que si está accediendo a la memoria que no debería estar, entonces algo ha salido muy mal mal y la recuperación es probablemente imposible. (2) Un núcleo se descargará solo una vez que se haya detenido el proceso. (3) El volcado del núcleo solo incluye la memoria y los registros del proceso que se volcó. (4) Otros procesos, la CPU y el núcleo no se ven afectados por una falla de otro proceso.
Alex L.