GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es una "falla de segmentación" un error del sistema o un error del programa?

Actualmente estoy ejecutando un script de modelado estadístico que realiza un ANOVA filogenético. El script funciona bien cuando analizo el conjunto de datos completo. Pero cuando tomo un subconjunto, comienza a analizar pero rápidamente termina con una falla de segmentación. Realmente no puedo averiguar buscando en Google si esto podría deberse a un problema de mi parte (por ejemplo, un conjunto de datos de muestra demasiado pequeño para el análisis) y/o un error en el script o si esto tiene algo que ver con mi sistema Linux. Leí que tiene que ver con escribir datos en la memoria, pero ¿por qué todo está bien con un conjunto de datos más grande? Traté de encontrar más información usando google, pero esto lo hizo más complicado.

Gracias por aclarar de antemano!

Respuesta aceptada:

(tl; dr:es casi seguro que es un error en su programa o en una biblioteca que usa).

Una falla de segmentación indica que un acceso a la memoria no fue legal. Es decir, en función de la solicitud emitida, la CPU emite un error de página porque la página solicitada no es residente o tiene permisos que no son congruentes con la solicitud.

Después de eso, el kernel verifica si simplemente no sabe nada sobre esta página, si aún no está en la memoria y debería colocarla allí, o si necesita realizar algún manejo especial (por ejemplo, copiar en -las páginas de escritura son de solo lectura, y esto válido la falla de la página puede indicar que debemos copiarla y actualizar los permisos). Consulte Wikipedia para conocer las fallas menores y mayores (p. ej., paginación por demanda) y fallas de página no válida.

Obtener una falla de segmentación indica el caso no válido:la página no solo no está en la memoria, sino que el kernel tampoco tiene ninguna acción correctiva que realizar porque el proceso lógicamente no tiene asignada esa página de su espacio de direcciones virtuales. Como tal, esto casi seguramente indica un error en el programa o en una de sus bibliotecas subyacentes, por ejemplo, intentar leer o escribir en la memoria que no es válida para el proceso. Si la dirección hubiera sido válida, podría haber dañado la pila o haberse garabateado sobre otros datos, pero al leer o escribir un un la página mapeada es capturada por el hardware.

La razón por la que funciona con su conjunto de datos más grande y no con su conjunto de datos más pequeño es completamente específica de ese programa:es probable que sea un error en la lógica de ese programa, que solo se dispara para el conjunto de datos más pequeño por alguna razón (por ejemplo, su conjunto de datos puede tener un campo que representa el número total de entradas, y si no se actualiza, su programa puede leer a ciegas en la memoria no asignada si no realiza otras comprobaciones de cordura).

Es varios órdenes de magnitud menos probable que simplemente ser un error de software, pero una falla de segmentación también puede ser un indicador de problemas de hardware, como memoria defectuosa, una CPU defectuosa o su hardware tropezando con erratas (como ejemplo, vea aquí).

Relacionado:Debian:¿automatizar la instalación de paquetes individuales de Debian 8 con indicaciones interactivas?

Obtener fallas de segmento debido a fallas en el hardware a menudo da como resultado un comportamiento que a veces funciona, aunque un bit defectuoso en la RAM física puede mapearse de la misma manera en ejecuciones repetidas de un programa si no ejecuta nada más en el medio. En su mayoría, puede descartar esta posibilidad arrancando memtest86+ para comprobar si hay fallas en la memoria RAM y usando un software como Prime95 para hacer una prueba de esfuerzo de su CPU (incluidas las unidades de ejecución FP math FMA).

Puede ejecutar el programa en un depurador como gdb y obtener el seguimiento en el momento de la falla de segmentación, lo que probablemente indicará el culpable:

% gdb --args ./foo --bar --baz
(gdb) r   # run the program
[...wait for segfault...]
(gdb) bt  # get the backtrace for the current thread

Linux
  1. Cómo crear páginas de error personalizadas en cPanel

  2. Solucionar error de PHP:no es seguro confiar en la configuración de la zona horaria del sistema

  3. Red de error nombrada inaccesible en los registros del sistema [Fijar]

  4. ¿Cómo redirigir la información de error del programa C ejecutable a la salida estándar? (Mac OS X)?

  5. ¿Cómo instalar una versión anterior de un programa?

Cómo resolver el error de Initramfs en Fedora

Cómo crear su primer programa Java en Debian 10

Su primer programa Java en la terminal de Ubuntu

Cómo crear una página de error 404 personalizada en cPanel

Cómo reparar el error "Problema del programa del sistema detectado" en Ubuntu

Cómo:Introducción a la programación:su primer programa