La aplicación en ejecución termina con "Falla de segmentación"

40

Tengo una aplicación de línea de comandos que, cuando se ejecuta, no hace lo que se supone que debe hacer y, en cierto punto, deja el mensaje:

Segmentation fault

¿Qué significa esto? ¿Qué tengo que hacer?

encerrada dorada
fuente
relacionado: stackoverflow.com/questions/2876357/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

63

Un fallo de segmentación es el resultado de una infracción de acceso a la memoria. El programa se ha referido a una dirección de memoria fuera de lo que se le asignó, y el núcleo del sistema operativo responde matando el programa con SIGSEGV.

Esto es un error, ya que no tiene sentido intentar acceder a la memoria inaccesible (no se puede hacer). Sin embargo, es fácil cometer errores de este tipo, particularmente en lenguajes como C y C ++ (que representan muchas aplicaciones comunes). Indica un error en el programa o en una biblioteca a la que se vincula. Si desea informar el error (sí, esto ayuda), es una buena idea incluir un seguimiento de los eventos que condujeron a la falla seg.

Para hacer esto, puede ejecutar el programa dentro gdb(el depurador GNU), que debería estar disponible desde cualquier distribución de Linux si aún no está instalado (el paquete se llamará "gdb"). Si la aplicación rota se llama "brokenapp":

gdb brokenapp

Aparecerá un párrafo sobre derechos de autor y licencias, y al final un mensaje con el cursor:

(gdb) _ 

Escriba runy presione enter. Si necesita proporcionar argumentos (por ejemplo -x --foo=bar whatever), agregue esos ( run -x --foo=bar whatever). El programa hará lo que hace, verá el resultado y, si necesita interactuar, puede hacerlo (tenga en cuenta que puede ejecutar cualquier tipo de programa, incluida una GUI, dentro de gdb). En el punto donde generalmente se daña, verá:

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _

La segunda línea de salida aquí es solo un ejemplo. Ahora escriba bt(para "retroceder") y presione enter. Verás algo como esto, aunque puede ser mucho más largo:

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()

Si es más largo, solo obtendrá una pantalla a la vez y habrá un --More--mensaje. Sigue presionando enter hasta que esté hecho. Ahora puede quit, la salida permanecerá en su terminal. Copie todo desde Program received signal SIGSEGVadelante en un archivo de texto y presente un informe de error con el rastreador de errores de la aplicación; puede encontrarlos en línea buscando, por ejemplo, "informe de error de Brokenapp", probablemente tendrá que registrarse para que se le envíe una respuesta por correo electrónico. Incluya su descripción del problema, los argumentos que proporcionó run, etc., y una copia de la traza inversa (si es muy larga, puede haber un medio para adjuntar un archivo de texto en la interfaz del rastreador de errores). También incluya la versión, si sabe de qué se trata ( brokenapp --versionpuede funcionar o la página del manual puede indicar cómo obtenerlo),

Esperemos que alguien te responda en poco tiempo. Archivar errores es generalmente apreciado.

encerrada dorada
fuente
1
La falla de segmentación también puede ocurrir en los idiomas de los intérpretes (debido principalmente a errores en el propio intérprete),
Braiam
¡Esto es súper útil! ¿Existe la posibilidad de entrar? poner una marca de stop e intentar averiguar más?
Zloy Smiertniy
1
@ZloySmiertniy gdbhace muchas cosas . Desea hacer clic en la sección 5.1
Ricitos de Oro
11

Esto significa que la aplicación tiene un error.

  • Si es un usuario final, debe comunicarse con el proveedor de la aplicación.

    • Si vino con una distribución de Linux, debe crear un informe de error para esa distribución.
    • Para aplicaciones no comerciales de terceros, debe informar el error al autor o a este rastreador de errores de aplicaciones en particular. Por lo general, puede encontrar un lugar navegando por el sitio de la aplicación o descargando el paquete binario / fuente.
    • Para aplicaciones comerciales, debe contactar al soporte.
  • Si es su propia aplicación, puede:

    1. habilitar archivos principales: $ ulimit -c unlimited
    2. reproducir el accidente: $ ./yourapp
    3. bloqueo de depuración con gdb: $ gdb ./yourapp core

Los archivos principales también serán muy útiles para los desarrolladores que no sean usted: contienen el estado completo del programa en el momento del bloqueo; si va a presentar un informe de error, adjúntelos y, en algunos casos, su aplicación binaria. Tenga en cuenta que existe una pequeña posibilidad de que sus datos personales, como números de cuenta, contraseñas y similares, permanezcan en la memoria del programa en el momento del bloqueo. En muchos casos, informar solo la traza inversa del hilo bloqueado es de gran ayuda para que los desarrolladores encuentren el problema. Para retroceder, puede cargar el archivo central con el depurador (como gdb executable corefile).

gena2x
fuente
Según el cuadro de diálogo de Microsoft, solo debe comunicarse con su proveedor "si el problema persiste", de lo contrario no se moleste. Los accidentes raros no son errores reales, solo reproducibles.
Kaz
44
Mi observación es que la calidad del software de Microsoft es baja en muchos casos en comparación con el software UNIX, y es bueno que en el mundo UNIX la gente generalmente no se refiera a sus pautas.
gena2x