2009-02-02 11 views
39

¿Hay alguna opción de gcc que pueda configurar que me dará el número de línea de la falla de segmentación?Número de línea de falla de segmentación

sé que puedo: Línea

  1. de depuración por la línea
  2. printfs poner en el código se estreche hacia abajo.

ediciones:

  1. bt/where en GDB no dan ninguna pila.
  2. Helpful suggestion
+0

¿Puedes publicar tus banderas del compilador? – cbrulak

+0

gcc -DDEBUG -I "" -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP – Rohit

+0

(la próxima vez, ponga su código en su pregunta, por favor). – cbrulak

Respuesta

54

No sé de una opción de gcc, pero usted debería ser capaz de ejecutar la aplicación con el BGF y luego cuando se rompe, el tipo where a echar un vistazo a la pila cuando salió, que debería acercarte.

$ gdb blah 
(gdb) run 
(gdb) where 

Editar esté completo:

También debe asegurarse de que la construcción de la aplicación con indicadores de depuración en el uso de la opción de gcc -g para incluir números de línea en el ejecutable.

Otra opción es usar el comando bt (backtrace).

+2

¿Qué hago si muestra "No stack"? – Rohit

+0

Algunos bloqueos pueden corromper los contenidos stact y, probablemente, sea lo mejor al insertar printf y verificar la validez de la entrada en varios puntos de código. – che

+2

también podría probar mi sugerencia a continuación: utiliza las rutinas de desenrollado de la pila de glibc para imprimir una pila sin tener que recurrir a gdb. – tgamblin

4

también necesita construir con indicadores de depuración en -g

También puede abrir el volcado de memoria con gdb (que necesita -g sin embargo).

+0

Brulak está en el blanco, si no está obteniendo una pila en gdb, necesita reparar sus símbolos –

1

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 haya fallado por 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).

19

Aquí es una sesión completa cáscara/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 piratería :-)

+2

bt y donde dice "Sin pila". ¿Cómo arreglo eso? – Rohit

+5

lo ejecuta en mi computadora ;-) [perdón] –

9

Puede obtener gcc para imprimir que un StackTrace cuando el programa recibe una señal SEGV, similar a la forma en Java y otros lenguajes más amigables manejan excepciones de punteros nulos. Véase mi respuesta aquí para más detalles:

Lo bueno de esto es que basta con dejarlo en el 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.

+0

El enlace está roto ... el corregido es: http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when- my-gcc-c-app-crashes –

3

Si todas las sugerencias anteriores para compilar con la depuración (-g) y se ejecutan bajo un depurador (gdb, correr, bt) no están trabajando para usted, entonces:

  • Primaria: Tal vez no eres 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á/estaba realmente ejecutándose pero su gdb dice "No hay pila", tal vez su puntero de 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.
5

Ejecútelo bajo valgrind.

1

Parece que el problema No stack ocurre 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.

Cuestiones relacionadas