prefacio
En el IDE de la serie VS, estamos acostumbrados a la depuración de la ventana gráfica; y bajo la línea de comando de linux, usamos la herramienta gdb para completar la depuración del programa.
Después de leer este artículo, sabrás:
- mostrar código
- punto de interrupción, saltar al punto de interrupción
- Proceso por proceso
- ejecutar sentencia por sentencia
- Información variable de pantalla larga
- Saltar a la línea especificada
- Deshabilitar puntos de interrupción
- Cambiar variables durante la depuración
1. Cómo compilar el código fuente en un archivo binario depurable
Solíamos usar este comando al compilar un archivo fuente en lenguaje C mytest.c:
gcc mytest.c -o mytest
El archivo ejecutable se generó con éxitomytest
Si depuramos este ejecutable directamente con gdb, no encontraremos información de depuración:
¿por qué?
Cuando el programa está compilado por defecto en Linux
- El programa ejecutable generado por defecto es la versión de lanzamiento y no es ajustable
entonces
- Necesita depurar, gcc necesita agregar
-g
parámetros publicar el programa en modo de depuración, para que gdb pueda rastrear y depurar el archivo ejecutable con información de depuración ->, a saber:
gcc mytest.c -o mytest_debug -g
Lo que también podemos encontrar es que el archivo ejecutable de la versión de depuración es más grande que la versión de lanzamiento, lo cual se debe a que se agrega la información de depuración
2. Empezar a depurar
Primero da el archivo fuente:
#include <stdio.h>
int sum(int top) {
int _sum = 0;
int i = 0;
for(;i <= top; i++) {
_sum += i;
}
return _sum;
}
int main() {
int max = 0;
printf("please enter your data# ");
scanf("%d",&max);
int _sum = sum(max);
printf("1:%d\n", _sum);
printf("2:%d\n", _sum);
printf("3:%d\n", _sum);
printf("4:%d\n", _sum);
printf("5:%d\n", _sum);
printf("6:%d\n", _sum);
return 0;
}
Primero compilamos y generamos un archivo ejecutable con información de depuración
gcc mytest.c -o mytest_debug -g
Luego gdb depuración:
gdb mytest_debug
Pedido | efecto |
---|---|
lista/l | Mostrar código fuente (10 líneas a la vez) |
correr/r | ejecuta el programa |
siguiente/n | Proceso por proceso |
pasos | Ejecutar declaración por declaración, puede ingresar la función |
número de línea break/b | Establecer un punto de interrupción en una línea |
descanso de información | Ver información de punto de interrupción |
finalizar | Ejecutar hasta que la función actual regrese |
imprimir/p | imprimir el valor de una expresión |
hay un conjunto | cambiar el valor de una variable |
Seguir | saltar al siguiente punto de interrupción |
eliminar puntos de interrupción | eliminar todos los puntos de interrupción |
eliminar puntos de interrupción m | Eliminar punto de interrupción con número de secuencia n |
deshabilitar puntos de interrupción m | Deshacer el seguimiento del punto de interrupción con el número de secuencia n |
habilitar puntos de interrupción m— | Reanudar el seguimiento del punto de interrupción número n |
puntos de interrupción de información | Imprimir puntos de interrupción establecidos |
mostrar el nombre de la variable | Mostrar una variable durante mucho tiempo |
no mostrar el nombre de la variable | Cancelar la visualización larga de una variable |
hasta el número de línea | saltar a una línea |
salir/q | salir de gdb |
Lo siguiente demuestra comandos comunes
2.1 Mostrar código l
list/l 行号
Muestre el código fuente, muestre 10 líneas a la vez, y luego presione Enter continuará mostrándose hacia abajo
2.2 Ejecución del programa r
Empezamos a depurar, es decir, a ejecutar el programa:
run/r
Descubrimos que después de r, el código se ejecutaba directamente en la declaración de entrada en la línea 14 y el programa finalizaba directamente después de la entrada, sin depurar en absoluto. La razón es porque no establecimos un punto de interrupción, si se establece un punto de interrupción, r se detendrá en el primer punto de interrupción, de modo que podamos hacer un solo paso.
2.3 Establecer y ver puntos de interrupción
b 行号 //设置断点
info b //查看断点
Establecemos puntos de interrupción en las líneas 14, 15, 19
2.4 siguiente depuración paso a paso
Seguimos r para ejecutar el programa, y luego n paso a paso
n
Se encuentra que n no nos permite ingresar al cuerpo de la función, lo que muestra que n es una depuración proceso por proceso.
Depuración declaración por declaración en 2.5 pasos
Entramos en el cuerpo de la función con s
2.6 Finalizar se ejecuta hasta que la función actual regresa y se detiene
finish
2.7 c salta al siguiente punto de interrupción
c
2.8 pantalla variable de pantalla larga
display 变量名
undisplay 变量序号
Tenga en cuenta que undisolay es el número de serie delante de la variable