Método de uso simple del depurador gdb en Linux

Qué

GDB (depurador simbólico GNU) es el depurador del proyecto GNU, que le permite ver las operaciones que realiza otro programa durante la "ejecución" -o las operaciones que se realizan cuando el programa falla y ① depurar programas ejecutables ② depurar archivos Coredump.

GDB puede hacer cuatro cosas principales (y otras cosas que apoyan estas cosas) para ayudarlo a detectar errores de comportamiento:

Inicie su programa y especifique todo lo que pueda afectar su comportamiento.
Haga que el programa se detenga en las condiciones especificadas.
Compruebe lo que sucede cuando el programa se detiene.
Cambie el contenido del programa para que pueda intentar corregir los efectos de un error y luego continuar aprendiendo otro error.

Cómo

La premisa de usar el depurador "GDB" es que el objetivo a depurar es el programa binario "debug". El programa binario compilado por gcc / g ++ en Linux es el "lanzamiento" por defecto, por lo que cuando se compila el código fuente es necesario para agregar la opción "-g", tomamos el programa numérico de Fibonacci como ejemplo:

Programa ejecutable de depuración

Inserte la descripción de la imagen aquí
Luego usamos gcc para compilar y generar un archivo binario "5 de febrero"
Inserte la descripción de la imagen aquí
que se puede depurar por nosotros , y es todo el trabajo que GDB tiene que hacer.

gdb <nombre de archivo binario>: Para iniciar la depuración Inserte la descripción de la imagen aquí
, ejecute el comando list (abreviado l) en gdb para enumerar los códigos :
① list / l <número de línea> muestra las 10 líneas de código adjuntas al cambio de línea;
② list / l <nombre de la función> muestra el nombre de la función El código de la función con "";
Inserte la descripción de la imagen aquí
ejecutar / r: ejecutar el programa, el
Inserte la descripción de la imagen aquí
programa se cierra normalmente y el quinto número de Fibonacci sale como "5";

Configuración del punto de
interrupción : ① break / b <número de línea>: establece un punto de interrupción en una línea determinada;
② break / b <nombre de la función>: establece un punto de interrupción al comienzo de la función;
③ info break / ib: ve la información del punto de interrupción;
④ eliminar <número de serie del punto de interrupción>: eliminar el punto de interrupción;
⑤ desactivar <número de serie del punto de interrupción>: desactivar el punto de interrupción;
⑥ activar <número de serie del punto de interrupción>: activar el punto de interrupción para que surta efecto.
Inserte la descripción de la imagen aquí
La desactivación del punto de interrupción no elimina el punto de interrupción. Después de desactivar el punto de interrupción Nº 2, el "Enb" del punto de interrupción Nº 2 cambia de "y" a "n";

siguiente / n: ejecutar el proceso
paso a paso , que es equivalente a F10 en VS; paso / s: ejecutar sentencia por sentencia, equivalente a F11 en VS;
imprimir / p <nombre de variable / expresión>: imprimir el valor de una variable o expresión
continue / c: comienza continuamente desde la posición actual en lugar de la ejecución de un solo paso;
eliminamos todos los puntos de interrupción anteriores, luego restablecemos los puntos de interrupción y ejecutamos el programa.
Inserte la descripción de la imagen aquí
Salir de la depuración: quit / q;

Archivo de depuración de Coredump (archivo de bloqueo o espejo de memoria)

Da un ejemplo simple:
Inserte la descripción de la imagen aquí

La asignación de un valor a un puntero nulo aquí definitivamente reportará un error.
Inserte la descripción de la imagen aquí
Luego compile y ejecute,
aquí se informa una falla de segmentación, lo que significa una falla de segmentación y acceso a un puntero nulo o memoria fuera de límites.
Primero, verifiquemos si el archivo de duplicación de memoria se puede generar en el entorno actual. Las condiciones son:
① El tamaño del núcleo debe establecerse en el sistema operativo Linux. Ulimit -c comprueba el tamaño del espacio del archivo del núcleo. El valor predeterminado es 0, lo que significa que no importa cuál sea la situación.Si no se genera el archivo espejo de memoria, ingrese el comando ulimit -c unlimited para liberar el límite. (Límite suave)
②El tamaño del disco es suficiente. (Límite duro)

Ejecute el archivo de nuevo:
Inserte la descripción de la imagen aquí
genere un archivo de imagen de memoria. Este archivo guarda el valor en la memoria del programa en el momento del bloqueo.
Inicie la depuración:
gdb <archivo ejecutable> <nombre del archivo de imagen de memoria> El
Inserte la descripción de la imagen aquí
programa recibe la señal número 11 y genera una falla de segmentación. También informó la línea de código que provocó que el programa se bloqueara.
Línea 6 * p = 'a'; la desreferenciación se bloquea y puede asignar un puntero nulo, o un puntero salvaje,
Inserte la descripción de la imagen aquí
imprime el puntero desreferenciado, 0 × 0 es un puntero nulo.

Supongo que te gusta

Origin blog.csdn.net/qq_43560037/article/details/114752195
Recomendado
Clasificación