+1 por la respuesta de Tibor.
En programas más grandes o si usa bibliotecas adicionales, también puede ser útil mirar el backtrace con gdb:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html
Use un depurador, como gdb
o si esto no es aplicable un strace
herramienta para obtener una mejor idea de dónde ocurre la falla de segmento.
Si usa gcc
, asegúrese de compilar con -g
cambiar para incluir información de depuración. Entonces, gdb
le mostrará la ubicación exacta en un código fuente donde falla.
Por ejemplo, si tenemos este programa obviamente defectuoso:
nuevo.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
Lo compilamos con gcc -g new.c -o new
y luego ejecute el gdb
sesión con gdb new
:
Emitimos el run
comando en la sesión interactiva y el resto está claro:
(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]
Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main () at new.c:6
6 printf("%d", *i);
(gdb)
Como han señalado DasMoeh y netcoder, cuando se produce un error de segmento, puede utilizar el backtrace
comando en la sesión interactiva para imprimir una pila de llamadas. Esto puede ayudar a identificar aún más la ubicación de una falla de segmento.
La forma más fácil es usar valgrind
. Indicará la ubicación donde se produce el acceso no válido (y otros problemas que no causaron el bloqueo pero que aún no eran válidos). Por supuesto, el problema real podría estar en otra parte del código (p. ej., un puntero no válido), por lo que el siguiente paso es comprobar el código fuente y, si sigue confundido, utilizar un depurador.