Compilar y depurar programas en C
En este paso, aprenderás técnicas esenciales de compilación y depuración para programas en C, incluyendo la comprensión de las advertencias del compilador, el uso de banderas de compilación y estrategias básicas de depuración.
Crea un programa con errores intencionales
- Abre el WebIDE y crea un nuevo archivo llamado
debug.c
.
- Ingresa el siguiente código con algunos errores intencionales:
#include <stdio.h>
int main() {
int x = 10;
int y = 0;
// Intentional division by zero
int result = x / y;
printf("Result: %d\n", result);
// Unused variable
int z = 5;
return 0;
}
Compila con advertencias
Compila el programa con banderas de advertencia adicionales:
gcc -Wall -Wextra debug.c -o debug
Explicación de las banderas de compilación
-Wall
: Habilita la mayoría de los mensajes de advertencia
-Wextra
: Habilita advertencias aún más detalladas
Ejemplo de salida del compilador:
debug.c: In function ‘main’:
debug.c:13:9: warning: unused variable ‘z’ [-Wunused-variable]
13 | int z = 5;
| ^
Utiliza GDB para depurar
Compila con símbolos de depuración:
gcc -g debug.c -o debug
Inicia la depuración:
gdb./debug
Comandos de GDB:
run
: Inicia el programa
break main
: Establece un punto de interrupción en la función principal
print x
: Imprime el valor de la variable x
next
: Ejecuta la siguiente línea
quit
: Sale de GDB
(gdb) run
Starting program: /home/labex/project/debug
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGFPE, Arithmetic exception.
0x0000555555555167 in main () at debug.c:8
8 int result = x / y;
(gdb) print x
$1 = 10
(gdb) break main
Breakpoint 1 at 0x555555555155: file debug.c, line 4.
(gdb) next
Program terminated with signal SIGFPE, Arithmetic exception.
The program no longer exists.
(gdb) quit
GDB muestra un error de división por cero en la línea 8. El programa se bloquea debido a una excepción aritmética.
Corrige el programa
Modifica debug.c
para manejar la división de forma segura:
#include <stdio.h>
int main() {
int x = 10;
int y = 2; // Change from 0 to a non-zero value
if (y!= 0) {
int result = x / y;
printf("Result: %d\n", result);
} else {
printf("Error: Division by zero!\n");
}
return 0;
}
Vuelve a compilar y ejecuta:
gcc -Wall -Wextra debug.c -o debug
./debug
Salida:
Result: 5
Consejos de solución de problemas:
- Siempre compila con
-Wall -Wextra
- Presta atención a las advertencias del compilador
- Utiliza GDB para escenarios de depuración complejos
- Agrega comprobaciones de errores para posibles problemas en tiempo de ejecución