GDB - Guía rápida
Un depurador es un programa que ejecuta otros programas, lo que permite al usuario ejercer control sobre estos programas y examinar variables cuando surgen problemas.
GNU Debugger, que también se llama gdb, es el depurador más popular para sistemas UNIX para depurar programas C y C ++.
GNU Debugger le ayuda a obtener información sobre lo siguiente:
Si ocurrió un volcado del núcleo, ¿en qué declaración o expresión se bloqueó el programa?
Si ocurre un error al ejecutar una función, ¿qué línea del programa contiene la llamada a esa función y cuáles son los parámetros?
¿Cuáles son los valores de las variables del programa en un punto particular durante la ejecución del programa?
¿Cuál es el resultado de una expresión particular en un programa?
¿Cómo depura GDB?
GDB le permite ejecutar el programa hasta cierto punto, luego detener e imprimir los valores de ciertas variables en ese punto, o recorrer el programa una línea a la vez e imprimir los valores de cada variable después de ejecutar cada línea.
GDB utiliza una interfaz de línea de comandos simple.
Puntos a tener en cuenta
Aunque GDB puede ayudarlo a descubrir errores relacionados con la pérdida de memoria, no es una herramienta para detectar pérdidas de memoria.
GDB no se puede utilizar para programas que se compilan con errores y no ayuda a corregir esos errores.
Antes de realizar la instalación, verifique si ya tiene gdb instalado en su sistema Unix emitiendo el siguiente comando:
$gdb -help
Si GDB está instalado, mostrará todas las opciones disponibles dentro de su GDB. Si GDB no está instalado, proceda con una nueva instalación.
Puede instalar GDB en su sistema siguiendo los sencillos pasos que se describen a continuación.
step 1: Asegúrese de tener los requisitos previos para instalar gdb:
Un compilador C compatible con ANSI (se recomienda gcc; tenga en cuenta que gdb puede depurar códigos generados por otros compiladores)
Se requieren 115 MB de espacio libre en disco en la partición en la que va a construir gdb.
Se requieren 20 MB de espacio libre en disco en la partición en la que va a instalar gdb.
Programa de descompresión de GNU, gzip
los make utilidad: se sabe que la versión GNU funciona sin problemas, otras probablemente también lo hagan.
step 2: Descargue la distribución fuente gdb de ftp.gnu.org/gnu/gdb. (Nosotros usamos gdb-6.6.tar.gz para obtener estas instrucciones.) Coloque los archivos de distribución en su directorio de compilación.
step 3:En su directorio de compilación, descomprima gdb-6.6.tar.gz y extraiga los archivos fuente del archivo. Una vez que los archivos hayan terminado de extraerse, cambie su directorio de trabajo al directorio gdb-6.6 que se creó automáticamente en su directorio de compilación.
$ build> gzip -d gdb-6.6.tar.gz
$ build> tar xfv gdb-6.6.tar
$ build> cd gdb-6.6
step 4: Ejecute el script de configuración para configurar el árbol de origen de su plataforma.
$ gdb-6.6> .⁄configure
step 5: Construya gdb usando el make utilidad.
$ gdb-6.6> make
step 6: Inicie sesión como root e instale gdb usando el siguiente comando.
$ gdb-6.6> make install
step 7: Si es necesario, se puede recuperar espacio en disco eliminando el directorio de compilación gdb y el archivo de almacenamiento después de que se complete la instalación.
$ gdb-6.6> cd ..
$ build> rm -r gdb-6.6
$ build> rm gdb-6.6.tar
Ahora tiene gdb instalado en su sistema y está listo para usar.
UNA Debugging Symbol Tableasigna instrucciones en el programa binario compilado a su correspondiente variable, función o línea en el código fuente. Este mapeo podría ser algo como:
Instrucción del programa ⇒ nombre del elemento, tipo de elemento, archivo original, número de línea definido.
Las tablas de símbolos se pueden incrustar en el programa o almacenar como un archivo separado. Entonces, si planea depurar su programa, entonces es necesario que cree una tabla de símbolos que tendrá la información requerida para depurar el programa.
Podemos inferir los siguientes hechos sobre las tablas de símbolos:
Una tabla de símbolos funciona para una versión particular del programa; si el programa cambia, se debe crear una nueva tabla.
Las compilaciones de depuración suelen ser más grandes y más lentas que las compilaciones minoristas (no depuradas); Las compilaciones de depuración contienen la tabla de símbolos y otra información auxiliar.
Si desea depurar un programa binario que no compiló usted mismo, debe obtener las tablas de símbolos del autor.
Para que GDB pueda leer toda esa información línea por línea de la tabla de símbolos, necesitamos compilarla de manera un poco diferente. Normalmente compilamos nuestros programas como:
gcc hello.cc -o hello
En lugar de hacer esto, necesitamos compilar con el indicador -g como se muestra a continuación:
gcc -g hello.cc -o hello
GDB ofrece una gran lista de comandos, sin embargo, los siguientes comandos son los que se utilizan con más frecuencia:
b main - Pone un punto de interrupción al comienzo del programa
b - Pone un punto de interrupción en la línea actual
b N - Pone un punto de interrupción en la línea N
b +N - Pone un punto de interrupción N líneas hacia abajo desde la línea actual
b fn - Pone un punto de interrupción al comienzo de la función "fn"
d N - Elimina el número de punto de interrupción N
info break - lista de puntos de interrupción
r - Ejecuta el programa hasta un punto de interrupción o error.
c - Continúa ejecutando el programa hasta el siguiente punto de interrupción o error
f - Se ejecuta hasta que finaliza la función actual
s - Ejecuta la siguiente línea del programa.
s N - Ejecuta las siguientes N líneas del programa.
n - Como s, pero no entra en funciones
u N - Se ejecuta hasta que obtenga N líneas delante de la línea actual
p var - Imprime el valor actual de la variable "var"
bt - Imprime un seguimiento de pila
u - Sube un nivel en la pila.
d - Baja un nivel en la pila.
q - Sale de gdb
Introducción: inicio y parada
gcc -g myprogram.c
Compila myprogram.c con la opción de depuración (-g). Aún obtiene un a.out, pero contiene información de depuración que le permite usar variables y nombres de funciones dentro de GDB, en lugar de ubicaciones de memoria sin procesar (no es divertido).
gdb a.out
Abre GDB con el archivo a.out, pero no ejecuta el programa. Verá un mensaje (gdb): todos los ejemplos son de este mensaje.
r
r arg1 arg2
r <archivo1
Tres formas de ejecutar “a.out”, cargadas previamente. Puede ejecutarlo directamente (r), pasar argumentos (r arg1 arg2) o alimentar un archivo. Por lo general, establecerá puntos de interrupción antes de ejecutar.
help
h puntos de interrupción
Enumera temas de ayuda (ayuda) u obtiene ayuda sobre un tema específico (h puntos de interrupción). GDB está bien documentado.
q - Salir de GDB
Pasando por el código
Stepping le permite rastrear la ruta de su programa y concentrarse en el código que falla o devuelve una entrada no válida.
l
l 50
l mi función
Enumera 10 líneas de código fuente para la línea actual (l), una línea específica (l 50) o para una función (l myfunction).
siguiente
Ejecuta el programa hasta la siguiente línea y luego hace una pausa. Si la línea actual es una función, ejecuta toda la función y luego hace una pausa.next es bueno para recorrer rápidamente su código.
paso
Ejecuta la siguiente instrucción, no la línea. Si la instrucción actual establece una variable, es lo mismo quenext. Si es una función, saltará a la función, ejecutará la primera instrucción y luego hará una pausa.step es bueno para profundizar en los detalles de su código.
terminar
Termina de ejecutar la función actual, luego hace una pausa (también llamado paso fuera). Útil si ingresó accidentalmente a una función.
Puntos de interrupción o puntos de observación
Los puntos de interrupción juegan un papel importante en la depuración. Pausan (rompen) un programa cuando llega a cierto punto. Puede examinar y cambiar variables y reanudar la ejecución. Esto es útil cuando ocurre alguna falla de entrada o cuando se deben probar las entradas.
descanso 45
romper mi función
- Establece un punto de interrupción en la línea 45 o en myfunction. El programa se detendrá cuando alcance el punto de interrupción.
ver x == 3
Establece un punto de observación, que detiene el programa cuando cambia una condición (cuando cambia x == 3). Los puntos de observación son excelentes para ciertas entradas (myPtr! = NULL) sin tener que interrumpir cada llamada de función.
Seguir
Reanuda la ejecución después de haber sido pausada por un punto de interrupción / observación. El programa continuará hasta que llegue al siguiente punto de interrupción / observación.
eliminar N
- Elimina el punto de interrupción N (los puntos de interrupción se numeran cuando se crean).
Configuración de variables
Ver y cambiar variables en tiempo de ejecución es una parte fundamental de la depuración. Intente proporcionar entradas no válidas a funciones o ejecutar otros casos de prueba para encontrar la causa raíz de los problemas. Normalmente, verá / establecerá variables cuando el programa esté en pausa.
imprimir x
Imprime el valor actual de la variable x. Poder utilizar los nombres de las variables originales es la razón por la que se necesita la bandera (-g); los programas compilados regularmente eliminan esta información.
establecer x = 3
establecer x = y
- Establece x en un valor establecido (3) o en otra variable (y)
llamar a myfunction ()
llamar a myotherfunction (x)
llamar strlen (mystring)
Llama a funciones definidas por el usuario o del sistema. Esto es extremadamente útil, pero tenga cuidado con las funciones con errores.
mostrar x
Muestra constantemente el valor de la variable x, que se muestra después de cada paso o pausa. Útil si está comprobando constantemente un determinado valor.
no mostrar x
- Elimina la visualización constante de una variable mostrada por el comando de visualización.
Retroceso y cambio de marcos
Una pila es una lista de las llamadas a funciones actuales; le muestra dónde se encuentra en el programa. Un marco almacena los detalles de una única llamada a función, como los argumentos.
bt
Backtraceso imprime la pila de funciones actual para mostrar dónde se encuentra en el programa actual. Si la función principal llama a la función a (), que llama a b (), que llama a c (), el backtrace es
c <= current location
b
a
main
up
abajo
Pasar al siguiente fotograma hacia arriba o hacia abajo en la pila de funciones. Si estas enc, puedes mudarte a b o a para examinar las variables locales.
regreso
- Vuelve de la función actual.
Manejo de señales
Las señales son mensajes lanzados después de ciertos eventos, como un temporizador o un error. GDB puede hacer una pausa cuando encuentra una señal; es posible que desee ignorarlos en su lugar.
manejar [nombre de señal] [acción]
manejar SIGUSR1 nostop
manejar SIGUSR1 noprint
manejar SIGUSR1 ignorar
Indique a GDB que ignore una determinada señal (SIGUSR1) cuando se produzca. Hay distintos niveles de ignorancia.
Revise los siguientes ejemplos para comprender el procedimiento de depuración de un programa y el núcleo volcado.
-
Este ejemplo demuestra cómo capturaría un error que ocurre debido a una excepción generada al dividir por cero.
-
Este ejemplo demuestra un programa que puede volcar un núcleo debido a la memoria no inicializada.
Ambos programas están escritos en C ++ y generan un volcado de memoria por diferentes razones. Después de pasar por estos dos ejemplos, debería estar en condiciones de depurar sus programas C o C ++ que generan volcados de núcleo.
Después de seguir este tutorial, debe haber adquirido un buen conocimiento de la depuración de un programa C o C ++ utilizando GNU Debugger. Ahora debería ser muy fácil para usted aprender la funcionalidad de otros depuradores porque son muy similares a GDB. Se recomienda encarecidamente que también consulte otros depuradores para familiarizarse con sus funciones.
Hay bastantes buenos depuradores disponibles en el mercado:
DBX Debugger- Este depurador se envía junto con Sun Solaris y puede obtener información completa sobre este depurador utilizando la página de manual de dbx, es decir, man dbx .
DDD Debugger- Esta es una versión gráfica de dbx y está disponible gratuitamente en Linux. Para tener un detalle completo, use la página de manual de ddd, es decir, man ddd .
Puede obtener detalles completos sobre GNU Debugger en el siguiente enlace: Depuración con GDB