GNU Debugger o GDB: una potente herramienta de depuración de código fuente para programas Linux

GNU Debugger o GDB: una potente herramienta de depuración de código fuente para programas Linux

Un depurador juega un papel vital en cualquier sistema de desarrollo de software. Nadie puede escribir un código sin errores de una sola vez. Durante el curso del desarrollo, se están generando errores y es necesario resolverlos para mejorarlos. Un sistema de desarrollo está incompleto sin un depurador. Teniendo en cuenta la comunidad de desarrolladores de código abierto, GNU Debugger es su mejor opción. También se utiliza para el desarrollo de software comercial en plataformas de tipo UNIX.

Herramienta de depuración GNU Herramienta depuradora GNU Depurar código fuente con GNU Debugger

GNU Debugger. también conocido como gdb. nos permite escabullirnos por el código mientras se ejecuta o lo que un programa estaba tratando de hacer en el momento antes de fallar. GDB básicamente nos ayuda a hacer cuatro cosas principales para detectar fallas en el código fuente.

  1. Iniciar el programa, especificando argumentos que pueden afectar el comportamiento general.
  2. Detener el programa en condiciones específicas.
  3. Examine el bloqueo o cuándo se detuvo el programa.
  4. Cambie el código y experimente con el código modificado instantáneamente.

Podemos usar gdb para depurar programas escritos en C. y C ++ sin mucho esfuerzo. A partir de ahora, la compatibilidad con otros lenguajes de programación como D. Modula-2. Fortran. es parcial.

Introducción GNU Debugger o GDB

GDB. se invoca mediante el comando gdb. Al emitir gdb. muestra información sobre la plataforma y lo lleva al indicador ( gdb. como se muestra a continuación.

[[email protected] ~] # gdb Salida de muestra GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 Copyright (C) 2013 Free Software Foundation, Inc. Licencia GPLv3 +: GNU GPL versión 3 o posterior Este es un software gratuito: puede cambiarlo y redistribuirlo. NO HAY GARANTÍA, en la medida permitida por la ley. Escriba “mostrar copia” y “mostrar garantía” para obtener más detalles. Este GDB se configuró como “x86_64-redhat-linux-gnu”. Escriba “mostrar configuración” para obtener detalles de configuración. Para obtener instrucciones sobre informes de errores, consulte: . Encuentre el manual de GDB y otros recursos de documentación en línea en: . Para obtener ayuda, escriba “ayuda”. Escriba “apropos word” para buscar comandos relacionados con “word”. ( gdb.

Escriba help. list para conocer las diferentes clases de comandos disponibles dentro de gdb. Escriba ayuda. seguido de un nombre de clase para obtener una lista de comandos en esa clase. Escriba ayudar a todos. para ver la lista de todos los comandos. Se permiten las abreviaturas de los nombres de los comandos si no son ambiguas. Por ejemplo, puede escribir n. en lugar de escribir siguiente. o c. para continuar. y así sucesivamente.

Los comandos GDB más utilizados freestar.config.enabled_slots.push

Los comandos gdb. de uso común se enumeran en la siguiente tabla. Estos comandos deben usarse desde el símbolo del sistema de gdb ( gdb. .

Comando Descripción ejecutar Iniciar la ejecución de un programa salir Salir de gdb print expr Imprime expresión donde expr también puede ser un nombre de variable next Ir a la siguiente línea paso Pasar a la siguiente línea continuar Continuar desde la línea actual hasta el final del programa o el siguiente punto de interrupción

Note la diferencia entre los dos comandos paso. y siguiente. El comando siguiente. no entra en la función si la siguiente línea es una llamada de función. Mientras que el comando paso. puede ir dentro de la función y ver qué sucede allí.

Una sesión de muestra con GDB

Considere el siguiente código fuente.

//sum.c #include int suma (int a, int b) int c; c = a + b; return c; int main () int x, y, z; printf (“\ nIntroduzca el primer número:”); scanf (“% d”, & x); printf (“Ingrese el segundo número:”); scanf (“% d”, & y); z = suma (x, y); printf (“La suma es% d \ n \ n”, z); return 0;

Para depurar el archivo de salida, necesitamos compilar lo mismo con la opción-g para gcc. de la siguiente manera.

$ gcc-g sum.c-o sum

El archivo de salida sum. se puede adjuntar a gdb a través de cualquiera de las siguientes 2 formas:

1. Especificando el archivo de salida como argumento para gdb.

Suma de $ gdb

2. Ejecutando el archivo de salida dentro de gdb usando el comando file.

$ gdb (gdb) file sum

El comando list. enumera las líneas en el archivo de código fuente y mueve el puntero. Entonces, la primera lista. mostrará las primeras 10 líneas y la siguiente lista. mostrará las siguientes 10 y así sucesivamente.

(gdb) list 1 #include 2 3 int suma (int a, int b) 4 int c; 5 c = a + b; 6 return c; 7 8 9 int main () {10 int x, y, z;

Para iniciar la ejecución, emita el comando ejecutar. Ahora el programa se ejecuta normalmente. Pero nos olvidamos de poner algunos puntos de interrupción en el código fuente para la depuración, ¿verdad? Estos puntos de interrupción se pueden especificar para funciones o en líneas específicas.

(gdb) b main

Nota. he usado una abreviatura b. para interrupción.

Después de establecer el punto de interrupción en la función principal, volver a ejecutar el programa se detendrá en la línea 11. Lo mismo puede hacerse efectivo si la línea El número se conoce antes.

(gdb) b sum.c: 11

Ahora recorra las líneas de código usando el comando next. o n. Es importante tener en cuenta que el comando siguiente. no entra en el código de la función a menos que se establezca un punto de interrupción en la función. Probemos ahora el comando imprimir. Establezca el punto de interrupción en la función suma como se muestra a continuación.

(gdb) b suma Punto de interrupción 1 en 0x4005aa: archivo sum.c, línea 5. (gdb) r Programa de inicio:/root/sum Ingrese el primer número: 2 Ingrese el segundo número: 3 Punto de ruptura 1, suma (a = 2, b = 3) en suma. c: 5 5 c = a + b; (gdb) p a $ 1 = 2 (gdb) p b $ 2 = 3 (gdb) c Continuando. La suma es 5 [Inferior 1 (proceso 3444) salió normalmente]

Si el programa que se está ejecutando requiere parámetros de línea de comando, proporcione lo mismo junto con el comando ejecutar. como.

(gdb ) correr . . .

Los archivos de la biblioteca compartida asociados con el programa en ejecución actual se pueden enumerar como.

(gdb) info share From To Syms Read Shared Object Library 0x00000035a6000b10 0x00000035a6019c70 Sí/lib64/ld-linux-x86-64.so.2 0x00000035a641f560 0x00000035a6560bb4 Sí/lib64/libc.so.6 Modificación de variables

GDB. también es capaz de modificar variables durante la ejecución del programa. Probemos esto. Como se mencionó anteriormente, establezca el punto de interrupción en la línea 16 y ejecute el programa.

(gdb) r Programa de inicio:/root/sum Ingrese el primer número: 1 Ingrese el segundo número: 2 Punto de interrupción 1, main () en suma. c: 16 16 printf (“La suma es% d \ n \ n”, z); (gdb) set z = 4 (gdb) c Continuando. La suma es 4

Ahora a = 1. b = 2. y el resultado debe ser z = 3. Pero aquí cambiamos el resultado final a z = 4. en la función principal. De esta manera, la depuración se puede hacer más fácil usando gdb.

Habilitar/deshabilitar puntos de interrupción

Para obtener la lista de todos los puntos de interrupción, escriba info breakpoints.

(gdb) info breakpoints Num Escriba Disp Enb Dirección Qué 1 punto de interrupción mantiene y 0x00000000004005c2 en main en sum.c: 11

Aquí solo hay un punto de interrupción y es To. habilitado deshabilitar los puntos de interrupción especifique el número de punto de interrupción junto con el comando deshabilitar. Para habilitar luego, use el comando enable.

(gdb) disable 1 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep n 0x00000000004005c2 in main at sum.c: 11

También puede eliminar los puntos de interrupción con el comando delete.

Depurar procesos en ejecución

Numerosos procesos se ejecutan en segundo plano en un sistema GNU/Linux. Para depurar un proceso en ejecución, en primer lugar, necesitamos encontrar la identificación del proceso de ese proceso en particular. El comando pidof. le da el pid de un proceso.

$ pidof

Ahora necesitamos adjuntar este pid a gdb. Hay 2 formas.

1. Especificando pid junto con gdb.

$ gdb-p

2. Usando el comando adjuntar de gdb.

(gdb) adjuntar

Eso es todo por ahora. Estos son solo los conceptos básicos de gdb para comenzar bien en la depuración del código fuente y es mucho más que lo explicado anteriormente. Por ejemplo, podemos depurar usando la información de la pila, variables de entorno y mucho más. Intenta jugar con todas estas cosas …