"BGF"
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
Luego usamos gcc para compilar y generar un archivo binario "5 de febrero"
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
, 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 "";
ejecutar / r: ejecutar el programa, el
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.
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.
Salir de la depuración: quit / q;
Archivo de depuración de Coredump (archivo de bloqueo o espejo de memoria)
Da un ejemplo simple:
La asignación de un valor a un puntero nulo aquí definitivamente reportará un error.
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:
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
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,
imprime el puntero desreferenciado, 0 × 0 es un puntero nulo.