debugging - tipos - Número de línea de falla de segmentación
tipos de segmentacion de mercado de servicios (8)
¿Hay alguna opción de gcc que pueda configurar que me dará el número de línea de la falla de segmentación?
Sé que puedo:
- Depurar línea por línea
- Ponga printfs en el código para reducirlo.
Ediciones:
-
bt
/where
en gdb da No stack. - Sugerencia útil
Aquí hay una sesión completa de shell / gdb
$ gcc -ggdb myproj.c $ gdb a.out gdb> run --some-option=foo --other-option=bar (gdb will say your program hit a segfault) gdb> bt (gdb prints a stack trace) gdb> q [are you sure, your program is still running]? y $ emacs myproj.c # heh, I know what the error is now...
Feliz hackeo :-)
Ejecútelo bajo valgrind.
El problema de No stack
parece suceder cuando el programa sale exitosamente.
Para el registro, tuve este problema porque había olvidado una devolución en mi código, lo que hizo que mi programa salga con el código de falla.
No hay ningún método para que GCC proporcione esta información, deberá confiar en un programa externo como GDB.
GDB puede darle la línea donde se produjo un bloqueo con el comando "bt" (abreviatura de "rastreo") después de que el programa cometió una falla seg. Esto le dará no solo la línea del bloqueo, sino la pila completa del programa (para que pueda ver lo que llamó la función donde ocurrió el bloqueo).
No sé de una opción de gcc, pero debería poder ejecutar la aplicación con gdb y luego, cuando falla, escriba where
echar un vistazo a la pila cuando salió, lo que debería acercarlo.
$ gdb blah
(gdb) run
(gdb) where
Editar para completar:
También debe asegurarse de compilar la aplicación con indicadores de depuración al usar la opción -g
gcc para incluir números de línea en el ejecutable.
Otra opción es usar el comando bt
(backtrace).
Puede hacer que gcc le imprima un stacktrace cuando su programa reciba una señal SEGV, similar a como Java y otros lenguajes más amigables manejan excepciones de punteros nulos. Vea mi respuesta aquí para más detalles:
- cómo generar un stacktace cuando mi aplicación C ++ falla (usando el compilador gcc)
Lo bueno de esto es que puedes dejarlo en tu código; no necesita ejecutar cosas a través de gdb para obtener el buen resultado de depuración.
Si compila con -g y sigue las instrucciones allí, puede usar una herramienta de línea de comandos como addr2line para obtener información de archivo / línea de la salida.
Si todas las sugerencias anteriores para compilar con la depuración (-g) y ejecutar bajo un depurador (gdb, ejecutar, bt) no funcionan para usted, entonces:
- Primaria: Tal vez no está corriendo bajo el depurador, solo está tratando de analizar el volcado de memoria post mortem. (Si inicia una sesión de depuración, pero no ejecuta el programa, o si se cierra, entonces cuando pida una traza inversa, gdb dirá "Sin pila", porque no hay ningún programa en ejecución. No lo olvide. para escribir "ejecutar"). Si se emitió en forma predeterminada, no olvide agregar el tercer argumento (
core
) cuando ejecute gdb; de lo contrario, comenzará en el mismo estado, sin estar conectado a ningún proceso o imagen de memoria en particular. - Difícil: si su programa está / realmente se estaba ejecutando pero su gdb dice "Sin pila", tal vez su puntero de la pila esté muy roto. En ese caso, puede ser un problema de desbordamiento del búfer en alguna parte, lo suficientemente grave como para demoler por completo su estado de tiempo de ejecución. GCC 4.1 es compatible con ProPolice "Stack Smashing Protector" que está habilitado con
-fstack-protector-all
. Se puede agregar a GCC 3.x con un parche.
también necesita construir con indicadores de depuración en -g
También puede abrir el volcado del núcleo con gdb (sin embargo, necesita -g).