segmentation retropie raspberry que dumped linux segmentation-fault

linux - retropie - segmentation fault(core dumped)



Segfault en el desbordamiento de la pila (6)

¿Por qué el kernel de Linux genera un error de segmentación en el desbordamiento de la pila? Esto puede hacer que la depuración sea muy incómoda cuando se desborda la creación alloca in c o fortran de matrices temporales. Seguramente debería ser posible que el tiempo de ejecución produzca un error más útil.


El "kernel" (en realidad no es el kernel que ejecuta el código, es la CPU) no sabe cómo su código hace referencia a la memoria que se supone que no debe tocar. Solo sabe que trataste de hacerlo.

El código:

char *x = alloca(100); char y = x[150];

realmente no puede ser evaluado por la CPU cuando intenta acceder más allá de los límites de x.

Puede presionar la misma dirección exacta con:

char y = *((char*)(0xdeadbeef));

Por cierto, desalentaría el uso de alloca ya que stack tiende a ser mucho más limitado que heap (usa malloc en su lugar).


En realidad, puede detectar la condición de un desbordamiento de pila utilizando manejadores de señal.

Para hacer esto, debes hacer dos cosas:

  • Configure un manejador de señal para SIGSEGV (segfault) usando sigaction, para hacer esto configure el indicador SO_ONSTACK. Esto instruye al kernel a usar una pila alternativa cuando entrega la señal.

  • Llame a sigaltstack () para configurar la pila alternativa que utilizará el controlador para SIGSEGV.

Luego, cuando desbordes la pila, el kernel cambiará a tu pila alternativa antes de entregar la señal. Una vez en su controlador de señal, puede examinar la dirección que causó la falla y determinar si se trató de un desbordamiento de la pila, o una falla regular.


Simplemente use Valgrind . Señalará todos sus errores de asignación de memoria con una precisión insoportable.


Un desbordamiento de pila es una falla de segmentación. Como ha roto los límites dados de la memoria que inicialmente le asignaron. La pila de tamaño finito, y la has excedido. Puedes leer más sobre esto en wikipedia

Además, una cosa que he hecho para proyectos en el pasado es escribir mi propio manejador de señal para segfault (mire la señal de la página man (2)). Normalmente capté la señal y escribí "Se produjo un error fatal" en la consola. Hice algunas cosas más con indicadores de punto de control y depuración.

Para depurar segfaults, puede ejecutar un programa en GDB. Por ejemplo, el siguiente programa C segfault: # segfault.c #include #include

int main() { printf("Starting/n"); void *foo=malloc(1000); memcpy(foo, 0, 100); //this line will segfault exit(0); }

Si lo compilo así:

gcc -g -o segfault segfault.c

y luego ejecutarlo así:

$ gdb ./segfault GNU gdb 6.7.1 Copyright (C) 2007 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"... Using host libthread_db library "/lib/libthread_db.so.1". (gdb) run Starting program: /tmp/segfault Starting Program received signal SIGSEGV, Segmentation fault. 0x4ea43cbc in memcpy () from /lib/libc.so.6 (gdb) bt #0 0x4ea43cbc in memcpy () from /lib/libc.so.6 #1 0x080484cb in main () at segfault.c:8 (gdb)

Me enteré por GDB que hubo una falla de segmentación en la línea 8. Por supuesto, hay formas más complejas de manejar desbordamientos de pila y otros errores de memoria, pero esto será suficiente.


Un desbordamiento de pila no necesariamente produce un bloqueo. Es posible que silenciosamente basura datos de su programa, pero continuará ejecutando.

No utilizaría los controladores de controladores SIGSEGV, sino que corregiría el problema original.

Si desea ayuda automatizada, puede usar la opción gcc -Wstack-Protector, que detectará algunos desbordamientos en el tiempo de ejecución y abortará el programa.

valgrind es bueno para errores dinámicos de asignación de memoria, pero no para errores de pila.


Algunos de los comentarios son útiles, pero el problema no está en los errores de asignación de memoria. Es decir, no hay ningún error en el código. Es bastante molesto en Fortran, donde el tiempo de ejecución asigna valores temporales en la pila. Por lo tanto, un comando como write (fp) x, y, z puede disparar son segfault sin advertencia. El soporte técnico para el compilador Intel Fortran dice que no hay forma de que la biblioteca de tiempo de ejecución pueda imprimir un mensaje más útil. Sin embargo, si Miguel tiene razón de lo que debería ser posible, como él sugiere. Así que muchas gracias. La pregunta restante es cómo encontrar primero la dirección de la falla seg y la figura si proviene de un desbordamiento de la pila o algún otro problema.

Para otros que encuentran este problema, hay una bandera del compilador que pone varibles temporales por encima de un cierto tamaño en el montón.