Encontrar errores en linux mediante el uso de 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 sencillo, por lo que el siguiente, dbgtst.c, es un programa artificial que contiene un error típico.

Video: Comando Linux Reparar Disco con fsck

# include static char buf [256] -void read_input (char * s) -INT main (void) {char * = null- de entrada / * Sólo un puntero, no hay almacenamiento de cadena * / read_input (entrada) - / * comando Process . * / Printf ("Que has proporcionado: sn%", De entrada) - / *. . ._ * / retorno 0-} void read_input (char * s) {printf ("Mando: ") -gets (s) -}

La función principal de este programa llama a la read_input función para obtener una línea de entrada del usuario. los read_input función espera un array de caracteres en la que se vuelve 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 -gramo opción:

gcc -g -o dbgtst dbgtst.c

Ignorar el mensaje de advertencia acerca de la consigue la función de ser peligroso- que está tratando de utilizar la deficiencia de esa función para ver cómo se puede utilizar gDB para el diagnóstico de problemas.

Para ver el problema con este programa, ejecutarlo y escribir prueba en el Mando: rápido:

./ DbgtstCommand: Fallo testSegmentation

El programa muere después de mostrar la 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, que no puede saber de inmediato lo que provoca el error. Eso es cuando usted tiene que usar gDB para encontrar la causa del problema.

Usar gDB para localizar un error, siga estos pasos:

  1. Cargar el programa bajo gDB.

    Por ejemplo, el tipo de dbgtst gDB cargar un programa llamado dbgtst en gDB.

  2. Comience la ejecución del programa bajo gDB escribiendo el correr mando. Cuando el programa solicita una respuesta, escriba algún texto de entrada.

    El programa no como lo hizo anteriormente. Esto es lo que sucede con el programa dbgtst:

    (BGF) correral iniciar el programa: / home / edulaney / swdev / dbgtstCommand: pruebaPrograma recibió SIGSEGV señal, Segmentación fault.0x400802b6 en gets () de /lib/tls/libc.so.6(gdb)
  3. 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 obtiene () desde /lib/tls/libc.so.6#1 0x08048474 en read_input (s = 0x0) en dbgtst.c: 16 # 2 0x08048436 en main () en dbgtst.c: 7 (gDB)

    La salida muestra la secuencia de llamadas a funciones. llamada a la función # 0 - el más reciente - es a la consigue función de biblioteca C. los consigue llamada se origina en el read_input la 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.

    Video: Recuperar el arranque o Grub de Ubuntu, Linux Mint, Debian y derivados

  4. Utilizar el lista mandar a inspeccionar las líneas de código fuente sospechosa.

    Video: Debugging básico en C++ con gdb

    En dbgtst, usted puede comenzar con la línea 16 de dbgtst.c presentar, de la siguiente manera:

    (BGF) Lista dbgtst.c: 1611 retorno 0-12} 13 read_input vacío (char * s) 14 15 {printf ("Mando: ") -16 gets (s) -17 18} (BGF)

    Después de buscar en este listado, se puede decir que el problema puede ser el camino read_input se llama. A continuación, 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 buf static char [256] -3 void read_input (char * s) -4 int main (void) 5 {6 char * entrada = null- / * Sólo un puntero, no de almacenamiento para cuerda * / 7 read_input (entrada) -8 / * Proceso de comandos. * / 9 printf ("Que has proporcionado: sn%", Entrada) -10 / *. . . * / 11 de retorno 0- (BGF)

    En este punto, se puede reducir el problema a la variable llamada entrada. Esa variable es una matriz, no una NULO (Lo que significa cero) puntero.

Artículos Relacionados