c++ - tipos - ¿Determinar la línea de código que causa una falla de segmentación?
tipos de segmentacion de mercado (4)
Además, puedes probar Valgrind: si instalas Valgrind y ejecutas valgrind --leak-check = full, entonces ejecutará tu programa y mostrará los rastros de pila para cualquier segfaults, así como también cualquier lectura o escritura inválida y pérdidas de memoria . Es realmente bastante útil.
¿Cómo determinamos dónde está el error en nuestro código que causa una falla de segmentación ?
Después de escribir un código, para determinar dónde tengo una falla de segmentación, ¿puede mi compilador ( gcc
) mostrarme la ubicación de la falla en mi programa?
GCC no puede hacer eso, pero GDB puede hacerlo. Compila tu programa usando el -g
, así:
gcc program.c -g
Luego usa gdb:
$ gdb ./a.out
(gdb) run
<segfault happens here>
(gdb) backtrace
<offending code is shown here>
Here hay un buen tutorial para comenzar con GDB.
La respuesta de Lucas sobre los vertederos principales es buena. En mi .cshrc tengo:
alias core ''ls -lt core; echo where | gdb -core=core -silent; echo "/n"''
para visualizar la traza inversa ingresando ''core''. Y el sello de fecha, para asegurar que estoy viendo el archivo correcto :(.
Agregado : Si hay un error de corrupción de la pila , la traza inversa aplicada al volcado del núcleo suele ser basura. En este caso, ejecutar el programa dentro de gdb puede dar mejores resultados, según la respuesta aceptada (asumiendo que la falla es fácilmente reproducible). Y también tenga cuidado con los procesos múltiples que descargan el núcleo simultáneamente; algunos SO agregan el PID al nombre del archivo central.
También podría usar un volcado de núcleo y luego examinarlo con gdb. Para obtener información útil, también debe compilar con el indicador -g
.
Cada vez que recibes el mensaje:
Segmentation fault (core dumped)
un archivo core está escrito en su directorio actual. Y puedes examinarlo con el comando
gdb your_program core_file
El archivo contiene el estado de la memoria cuando el programa se bloqueó. Un volcado de memoria puede ser útil durante la implementación de su software.
Asegúrese de que su sistema no establece el tamaño del archivo de volcado del núcleo en cero. Puede establecerlo en ilimitado con:
ulimit -c unlimited
¡Cuidado! que los vertederos centrales pueden volverse enormes