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?
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?
Respuestas:
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 run
y 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 SIGSEGV
adelante 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 --version
puede 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.
gdb
hace muchas cosas . Desea hacer clic en la sección 5.1
Esto significa que la aplicación tiene un error.
Si es un usuario final, debe comunicarse con el proveedor de la aplicación.
Si es su propia aplicación, puede:
$ ulimit -c unlimited
$ ./yourapp
$ 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
).