Encontrar errores en linux usando gdb
Para entender cómo se puede encontrar errores en Linux mediante el uso de gdb, necesita ver un ejemplo. El procedimiento es más fácil de mostrar con un ejemplo simple, por lo que el siguiente, dbgtst.c, es un programa artificial que contiene un error típico.
#include buf static char read_input -void (char * s) -INT main (void) char * entrada = null- / * Sólo un puntero, [256] {sin almacenamiento para cadena * / read_input (entrada) - / * comando Process . * / printf ("Usted escribió:% s n", entrada) - / *. . ._ * / return 0-} void read_input (char * s) {printf ("Comando:") -gets (s) -}
La función principal de este programa llama al read_input función para obtener una línea de entrada del usuario. los read_input función espera una matriz de caracteres en el que devuelve lo que el usuario escribe. En este ejemplo, sin embargo, principal llamadas read_input con un puntero no inicializado - ese es el error en este sencillo programa.
Construir el programa mediante el uso de gcc con el -g opción:
gcc -g -o dbgtst dbgtst.c
Ignore el mensaje de advertencia acerca de la consigue la función de ser peligroso- que está tratando de usar el inconveniente de que la función para ver cómo se puede utilizar gdb para localizar errores.
Para ver el problema con este programa, ejecutarlo y escribe prueba en el Comando: pedirá:
./ dbgtstCommand: culpa testSegmentation
El programa muere después de mostrar el Fallo de segmentación mensaje. Para un pequeño programa como este, es probable que pueda encontrar la causa examinando el código fuente. En una aplicación en el mundo real, sin embargo, usted no puede saber de inmediato lo que provoca el error. Eso es cuando usted tiene que utilizar gdb para encontrar la causa del problema.
Para usar gdb para localizar un error, siga estos pasos:
Cargue el programa bajo gdb.
Por ejemplo, escriba gdb dbgtst para cargar un programa llamado dbgtst en gdb.
Iniciar la ejecución del programa bajo gdb escribiendo el carrera comandos. Cuando el programa solicita la entrada, escriba algún texto de entrada.
El programa no como lo hizo anteriormente. Esto es lo que sucede con el programa dbgtst:
(gdb) carreraPrograma de inicio: / home / edulaney / swdev / dbgtstCommand: pruebaPrograma recibió SIGSEGV de señal, Segmentación fault.0x400802b6 en gets () de /lib/tls/libc.so.6(gdb)
Utilizar el dónde comando para determinar dónde murió el programa.
Para el programa dbgtst, los rendimientos de este comando esta salida:
(gdb) donde # 0 0x400802b6 en gets () de /lib/tls/libc.so.6#1 0x08048474 en read_input (s = 0x0) a dbgtst.c: 16 # 2 0x08048436 en main () en dbgtst.c: 7 (gdb)
La salida muestra la secuencia de llamadas a funciones. Llamada de función # 0 - el más reciente - es la consigue Función de biblioteca C. los consigue llamada se origina en el read_input función (en la línea 16 del archivo dbgtst.c), Que a su vez se llama desde el principal función en la línea 7 de la dbgtst.c archivo.
Utilizar el lista mandar a inspeccionar las líneas de código fuente sospechosa.
En dbgtst, usted puede comenzar con la línea 16 de dbgtst.c presentar, como sigue:
(gdb) Lista dbgtst.c: 1.611 retorno 0-12} 13 void read_input (char * s) 14 {15 printf ("Comando:") -16 gets (s) -17} 18 (gdb)
Después de ver este anuncio, se puede decir que el problema puede ser el camino read_input se llama. Entonces usted enumera las líneas alrededor de la línea 7 en dbgtst.c (donde el read_input llamada se origina):
(gdb) Lista dbgtst.c: 72 estática buf char [256] -3 vacío read_input (char * s) -4 int main (void) 5 {6 char * entrada = null- / * Sólo un puntero, hay almacenamiento de cadena * / 7 read_input (entrada) -8 / * comando Process. * / 9 printf ("Usted escribió:% s n", entrada) -10 / *. . . * / 11 retorno 0- (gdb)
En este punto, usted puede reducir el problema a la variable llamada entrada. Esa variable es un array, no un NULO (lo que significa cero) puntero.