Tabla de contenido
Por lo general, depuramos código C/C++ principalmente en VS bajo la plataforma Windows. En LInux, generalmente lo usamos
gdb
para 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
-
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.
Entonces, ¿cómo convertir los dos modos en Linux? -
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 可执行文件名 源代码文件
-
-g
Para usar la depuración de gdb, debe agregar opciones al usar gcc/g++ para generar programas binariosgcc -o 可执行文件名 源代码文件 -g g++ -o 可执行文件名 源代码文件 -g
A continuación, editamos el código de prueba en el siguiente archivo test.c para probar.
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:
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.
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.
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
expandir
Podemos usar el readlef
comando para ver la información debajo de los dos archivos ejecutables, de la siguiente manera:
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):
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
-
entrar en depuración
Use el
gdb file
comando para ingresar al modo de depuración, como se muestra a continuación
-
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 ell 1
principio para ver, y luego ingresamos la teclal
oEnter
para obtener el código de la última posición de búsqueda.
Nota: Después de ingresar el comando gdb, laEnter
clave 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
l
para ver, el código que se muestra es aleatorio
-
establecer punto de interrupción
-
break/b 行号
: establecer un punto de interrupción en una determinada líneaComo 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ónComo se muestra en la figura a continuación, establezca un punto de interrupción en la función addTestTop
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ónCuando 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.
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
-
-
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.
- Si no hay un punto de interrupción, ejecute directamente
- Si hay un punto de interrupción, ejecute hasta el punto de interrupción y deténgase.
-
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.
-
-
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
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
bt
comando -
-
Hay puntos de interrupción, después de ejecutar, ejecutar proceso por proceso
n/next
Es decir, cuando se encuentra una función, la siguiente instrucción se ejecuta directamente sin ingresar a la función.
- ¿Recuerda el
Enter
botón ejecutar el comando ejecutado la última vez? Si hay demasiados contenidos para depurar, simplemente presione una vezs
on
luegoEnter
presione
-
eliminar punto de interrupción
-
eliminar /d puntos de interrupción: eliminar todos los puntos de interrupción
-
delete/dn: elimina el punto de interrupción con el número de secuencia n
-
-
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
-
habilitar punto de interrupción número de punto de interrupción: habilitar punto de interrupción
-
-
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 -
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
-
-
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 -
Puede mostrar tipos personalizados, como tipos y estructuras integrados, stl
-
-
deshacer el seguimiento en el punto de interrupción
-
undisplay 序号
: use cuando no quiera rastrear una variable
-
-
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
-
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
-
De un punto de ruptura al siguiente
-
continue/c
: ejecutar directamente al siguiente punto de interrupción -
Después de combinar
util、finish、continue
, se puede realizar la función de depuración básica
-
-
salir de gdb
q/quit
: si está depurando, se le preguntará si necesita salir
3. Conjunto de instrucciones
gdb binFile
Salir: ctrl + d
o quit/q
Depurar 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