[Linux] El uso de debugger-gdb bajo Linux

Por lo general, depuramos código C/C++ principalmente en VS bajo la plataforma Windows. En LInux, generalmente lo usamos gdbpara depurar código. Aunque rara vez depuramos código en LInux, gdb rara vez se usa en el uso real. Pero debemos entenderlo para enfrentar varios ambientes.

El propósito de este artículo: poder realizar una depuración básica de programas de un solo proceso, es decir, utilizar las funciones básicas de depuración de VS 2019 y VS 2022, todas implementadas usando gdb en Linux.

Este artículo usará el editor vim , make/Makefile y gcc/g++ en el entorno Linux . Si no está familiarizado con estas tres herramientas, puede hacer clic en el enlace a continuación para aprender junto con este artículo.
editor vim
hacer/Makefile
gcc/g++

1. depurar y liberar

Antes de aprender a usar la depuración de gdb en Linux, debemos dominar los siguientes tres conocimientos previos sobre los modos de depuración y liberación

  1. Hay dos formas de liberar el programa, el modo de depuración y el modo de liberación

    Modo de depuración : este modo es un modo para que los programadores escriban programas y depuren códigos. El programa ejecutable generado en este modo contiene información de depuración que es más grande que el programa ejecutable generado en el modo de lanzamiento .

    Modo de lanzamiento : no hay información de depuración, el programa está optimizado, el tamaño del programa se reduce y es más adecuado para que lo usen los usuarios. El programa ejecutable generado bajo este modo es lo que la compañía eventualmente lanzará al mercado.Los evaluadores de la empresa probarán si es perfecto y luego lo lanzarán al mercado después de pasar la prueba.

    • Nota: Puede depurar en modo de depuración, pero no en modo de lanzamiento.

    La siguiente imagen es el diagrama de selección de los dos modos en VS 2019. Puede elegir el modo que necesita.
    inserte la descripción de la imagen aquí
    Entonces, ¿cómo convertir los dos modos en Linux?

  2. Bajo Linux, el programa ejecutable binario producido por gcc/g++ está en modo de lanzamiento por defecto

    • Es decir, en Linux, el programa ejecutable generado mediante el uso de instrucciones convencionales está en modo de lanzamiento y no se puede depurar.
    //常规生成
    gcc -o 可执行文件名 源代码文件
    g++ -o 可执行文件名 源代码文件
    
  3. -gPara usar la depuración de gdb, debe agregar opciones al usar gcc/g++ para generar programas binarios

    gcc -o 可执行文件名 源代码文件 -g
    g++ -o 可执行文件名 源代码文件 -g
    

A continuación, editamos el código de prueba en el siguiente archivo test.c para probar.
inserte la descripción de la imagen aquí
Nota: la séptima línea de código define las variables en el ciclo for i. Este método de escritura es compatible con c99, y el editor gcc/g++ que uso no es compatible. Esta forma de escritura debe agregarse después de ejecutar el comando -std=c99,

El Makefile es el siguiente:
inserte la descripción de la imagen aquí
Si no sabe cómo usar el Makefile, puede usar directamente las siguientes dos instrucciones para probar

gcc -o MyTest-debug test.c -g -std=c99     //生成debug模式的可执行文件
gcc -o MyTest-release test.c -std=c99     //生成release模式的可执行文件

Primero , pruebe si la depuración es posible en el modo de lanzamiento.
inserte la descripción de la imagen aquí
Como se muestra en la figura anterior, el cuadro rojo indica que no se han encontrado símbolos de depuración y que no se puede realizar la depuración.

En segundo lugar , pruebe si la depuración es posible en el modo de depuración.

inserte la descripción de la imagen aquí
No se muestra ningún mensaje de error y se puede depurar normalmente

Finalmente: observe el volumen de los dos archivos ejecutables, es obvio que la depuración es más grande que la liberación
inserte la descripción de la imagen aquí

expandir

Podemos usar el readlefcomando para ver la información debajo de los dos archivos ejecutables, de la siguiente manera:

inserte la descripción de la imagen aquí
Podemos usar este comando para ver la información de depuración en los dos archivos, de la siguiente manera (el comando grep es un comando de cadena de búsqueda):
inserte la descripción de la imagen aquí
La información de depuración se encuentra en el archivo MyTest-debug, pero no hay nada en MyTest-release.

2. Cómo usar gdb para depurar

El trabajo central del depurador: localizar el problema

A continuación, presentamos brevemente cómo usar gdb para depurar bajo Linux.Este párrafo se explica paso a paso, y el resumen de los comandos bajo gdb se encuentra en el siguiente párrafo.
Si no tiene propiedades para gdb, solo siga los pasos

  1. entrar en depuración

    Use el gdb filecomando para ingresar al modo de depuración, como se muestra a continuación
    inserte la descripción de la imagen aquí

  2. mostrar código para depurar

    • l/list 行号: Muestre el código fuente del archivo, comenzando desde el número de línea de entrada, y enumere diez líneas hacia abajo. Generalmente, cuando comenzamos a depurar, comenzamos desde el l 1principio para ver, y luego ingresamos la tecla lo Enterpara obtener el código de la última posición de búsqueda.
      inserte la descripción de la imagen aquí
      Nota: Después de ingresar el comando gdb, la Enterclave se registrará. Es decir, después de ingresar el comando, al ingresar la tecla Intro se repetirá la acción anterior. Las siguientes directivas también siguen esta regla.
    • Después de ingresar al modo gdb, úselo solo lpara ver, el código que se muestra es aleatorio
      inserte la descripción de la imagen aquí
  3. establecer punto de interrupción

    • break/b 行号: establecer un punto de interrupción en una determinada línea

      Como se muestra a continuación, establezca un punto de interrupción en la línea 19

    • break/b 函数名: Establecer un punto de interrupción al comienzo de una función

      Como se muestra en la figura a continuación, establezca un punto de interrupción en la función addTestTop

      inserte la descripción de la imagen aquí

      5 es el número de línea de la primera línea de código dentro de la función addTestTop.

    • break/b 文件名:函数名: cuando hay varios archivos, puede usar este método para establecer puntos de interrupción

    • info break/b: Ver información de punto de interrupción

      inserte la descripción de la imagen aquí

      Cuando el programa se está ejecutando, se detendrá en el punto de interrupción, y cuando vea el punto de interrupción la próxima vez, mostrará la cantidad de veces que se detuvo en el punto de interrupción.

      inserte la descripción de la imagen aquí

    Nota: El número de serie del punto de interrupción de gdb aumenta y continuará aumentando después de cada uso, hasta que se apague y se encienda, y comience nuevamente desde 1

  4. ejecuta el programa

    • r/ejecutar: ejecutar el programa

      • Si hay un punto de interrupción, ejecute hasta el punto de interrupción y deténgase.
        inserte la descripción de la imagen aquí
      • Si no hay un punto de interrupción, ejecute directamenteinserte la descripción de la imagen aquí
    • Nota: una ejecución finaliza después de que se ejecutan todos los códigos en todas las funciones principales. Después de detenerse en un punto de interrupción, realizar otras instrucciones de visualización no afectará esta depuración.

  5. Hay puntos de interrupción, después de ejecutar, ejecutar declaración por declaración

    • s/step: Cuando se encuentra una función, introduzca la función

      inserte la descripción de la imagen aquí

    Nota: Después de ingresar otras funciones, se generará una cadena de llamadas, es decir, una función llama a otra función y luego llama a otras funciones.

    Se puede ver por btcomando

    inserte la descripción de la imagen aquí

  6. Hay puntos de interrupción, después de ejecutar, ejecutar proceso por proceso

    • n/nextEs decir, cuando se encuentra una función, la siguiente instrucción se ejecuta directamente sin ingresar a la función.

    inserte la descripción de la imagen aquí

    • ¿Recuerda el Enterbotón ejecutar el comando ejecutado la última vez? Si hay demasiados contenidos para depurar, simplemente presione una vez so nluego Enterpresione
  7. eliminar punto de interrupción

    • eliminar /d puntos de interrupción: eliminar todos los puntos de interrupción

      inserte la descripción de la imagen aquí

    • delete/dn: elimina el punto de interrupción con el número de secuencia n

      inserte la descripción de la imagen aquí

  8. Activar y desactivar los puntos de interrupción

    Se usa cuando no queremos usar un punto de interrupción y no queremos eliminar el punto de interrupción

    • deshabilitar punto de interrupción número de punto de interrupción: desactivar el punto de interrupción

      inserte la descripción de la imagen aquí

    • habilitar punto de interrupción número de punto de interrupción: habilitar punto de interrupción

      inserte la descripción de la imagen aquí

  9. ver variables

    • p 变量名: Esta instrucción se ingresa cuando necesita ser verificada y no afectará la depuración. De la siguiente manera, después de ingresar la función addTestTop en la depuración, ejecuto algunas declaraciones y verifico el resultado de la variable sum. En este momento, el la suma es 6

      inserte la descripción de la imagen aquí

    • La eficiencia de visualización de esta manera es demasiado baja. Cuando usamos la depuración en VS, ejecutamos la variable correspondiente una vez y cambiamos en consecuencia. Puede verla directamente. Este método debe ser llamado por el propio usuario, lo cual es un inconveniente. puede utilizar el siguiente método

  10. Variables de vista de pista

    • display 变量名: Después de la ejecución, la variable se mostrará después de que se ejecute cada declaración

      inserte la descripción de la imagen aquí

    • Puede mostrar tipos personalizados, como tipos y estructuras integrados, stl

  11. deshacer el seguimiento en el punto de interrupción

    • undisplay 序号: use cuando no quiera rastrear una variable

      inserte la descripción de la imagen aquí

  12. Saltar a la línea especificada

    • until 行号: Saltar a la línea X, hay un bucle en nuestro código anterior, podemos usar esta instrucción para salir del bucle
      inserte la descripción de la imagen aquí
  13. ejecutar toda la función

    • finash: Ejecutar después de ingresar una función, solo ejecutar esta función y detenerse después de la ejecución

    inserte la descripción de la imagen aquí

  14. De un punto de ruptura al siguiente

    • continue/c: ejecutar directamente al siguiente punto de interrupción

      inserte la descripción de la imagen aquí

    • Después de combinar util、finish、continue, se puede realizar la función de depuración básica

  15. salir de gdb

    • q/quit: si está depurando, se le preguntará si necesita salir

    inserte la descripción de la imagen aquí

3. Conjunto de instrucciones

gdb binFileSalir: ctrl + do quit/qDepurar comando:

  • lista/l número de línea: muestre el código fuente de binFile, y luego vaya a la siguiente posición desde la última posición, y enumere 10 líneas cada vez.
  • list/l nombre de función: muestra el código fuente de una función.
  • r o ejecutar: Ejecutar el programa.
  • n o siguiente: ejecución única.
  • s o paso: ingrese la llamada de función
  • break(b) número de línea: establecer un punto de interrupción en una determinada línea
  • romper el nombre de la función: establece un punto de interrupción al comienzo de una función
  • info break : Ver información de punto de interrupción.
  • terminar: ejecutar hasta que vuelva la función actual, luego retirarse y esperar el comando
  • print§: imprime el valor de la expresión, se puede modificar el valor de la variable o se puede llamar a la función a través de la expresión
  • p variable: Imprime el valor de la variable.
  • set var: modificar el valor de una variable
  • continuar (o c): ejecución continua en lugar de un solo paso del programa desde la posición actual
  • run (o r): Ejecuta el programa continuamente desde el principio en lugar de un solo paso
  • eliminar puntos de interrupción: eliminar todos los puntos de interrupción
  • eliminar puntos de interrupción n: eliminar el punto de interrupción con el número de secuencia n
  • deshabilitar puntos de interrupción: deshabilitar puntos de interrupción
  • habilitar puntos de interrupción: habilitar puntos de interrupción
  • información (o i) puntos de interrupción: vea qué puntos de interrupción están establecidos actualmente
  • mostrar el nombre de la variable: rastrear y ver una variable, y mostrar su valor cada vez que se detiene
  • undisplay: desmostrar aquellas variables que se establecieron previamente
  • hasta el número de línea X: saltar a la línea X
  • breaktrace (o bt): vea las llamadas a funciones y los parámetros en todos los niveles
  • info(i) locales: vea el valor de las variables locales en el marco de pila actual
  • salir: salir de gdb

Supongo que te gusta

Origin blog.csdn.net/m0_52094687/article/details/128748413
Recomendado
Clasificación