La depuració és una habilitat essencial per a qualsevol programador. En aquest tema, explorarem diverses tècniques i eines que poden ajudar-te a identificar i corregir errors en el teu codi C. Aprendrem a utilitzar depuradors, a inserir missatges de depuració i a aplicar tècniques sistemàtiques per trobar i solucionar problemes.
- Introducció a la Depuració
Què és la Depuració?
La depuració és el procés de trobar i corregir errors (bugs) en el codi. Els errors poden ser de diversos tipus, com ara errors de sintaxi, errors lògics, errors de temps d'execució, etc.
Tipus d'Errors
- Errors de Sintaxi: Errors en la forma en què el codi està escrit.
- Errors Lògics: Errors en la lògica del programa que fan que no es comporti com s'esperava.
- Errors de Temps d'Execució: Errors que es produeixen durant l'execució del programa, com ara divisions per zero o accés a memòria no vàlida.
- Eines de Depuració
Depuradors (Debuggers)
Els depuradors són eines que permeten executar el codi pas a pas, inspeccionar variables i veure el flux d'execució del programa. Un dels depuradors més utilitzats per a C és GDB (GNU Debugger).
Instal·lació de GDB
Utilització Bàsica de GDB
- Compilar el programa amb informació de depuració:
gcc -g -o programa programa.c
- Iniciar GDB:
gdb programa
- Comandes Bàsiques de GDB:
break [funció/linia]
: Estableix un punt de ruptura.run
: Executa el programa.next
: Executa la següent línia de codi.step
: Entra dins de les funcions.print [variable]
: Mostra el valor d'una variable.continue
: Continua l'execució fins al següent punt de ruptura.
Missatges de Depuració
Inserir missatges de depuració en el codi pot ajudar a entendre el flux d'execució i a identificar on es produeixen els errors.
Exemple de Missatges de Depuració
#include <stdio.h> int main() { int a = 5; int b = 0; printf("Abans de la divisió\n"); if (b != 0) { int c = a / b; printf("Resultat: %d\n", c); } else { printf("Error: Divisió per zero\n"); } printf("Després de la divisió\n"); return 0; }
- Tècniques Sistemàtiques de Depuració
Dividir i Conquerir
Divideix el codi en parts més petites i comprova cada part per separat per identificar on es produeix l'error.
Reproduir l'Error
Intenta reproduir l'error de manera consistent. Això pot ajudar a identificar les condicions específiques que causen el problema.
Revisió de Codi
Revisa el codi amb un company o utilitza eines de revisió de codi per identificar possibles errors.
Utilitzar Valgrind per a la Depuració de Memòria
Valgrind és una eina que ajuda a detectar errors de gestió de memòria, com ara fuites de memòria.
Instal·lació de Valgrind
Utilització Bàsica de Valgrind
- Exercicis Pràctics
Exercici 1: Depuració amb GDB
- Escriu un programa C que contingui un error lògic.
- Compila el programa amb l'opció
-g
. - Utilitza GDB per identificar i corregir l'error.
Solució
#include <stdio.h> int main() { int a = 5; int b = 10; int c = a + b; // Error lògic: hauria de ser a * b printf("Resultat: %d\n", c); return 0; }
Utilitza les comandes de GDB per identificar que l'error és a la línia int c = a + b;
i corregeix-lo a int c = a * b;
.
Exercici 2: Depuració de Memòria amb Valgrind
- Escriu un programa C que contingui una fuita de memòria.
- Utilitza Valgrind per identificar i corregir la fuita de memòria.
Solució
#include <stdlib.h> int main() { int *arr = (int *)malloc(10 * sizeof(int)); // Fuita de memòria: no s'allibera la memòria return 0; }
Valgrind identificarà que la memòria no s'allibera. Corregeix el codi afegint free(arr);
abans de return 0;
.
- Resum
En aquesta secció, hem après diverses tècniques de depuració, incloent l'ús de depuradors com GDB, la inserció de missatges de depuració i l'ús d'eines com Valgrind per detectar errors de memòria. La depuració és una habilitat crucial que requereix pràctica i paciència, però amb les eines i tècniques adequades, pots identificar i corregir errors de manera eficient.
Curs de Programació en C
Mòdul 1: Introducció al C
- Introducció a la Programació
- Configuració de l'Entorn de Desenvolupament
- Programa Hello World
- Sintaxi i Estructura Bàsiques
Mòdul 2: Tipus de Dades i Variables
Mòdul 3: Flux de Control
Mòdul 4: Funcions
- Introducció a les Funcions
- Arguments de Funció i Valors de Retorn
- Àmbit i Durada de les Variables
- Funcions Recursives
Mòdul 5: Arrays i Strings
Mòdul 6: Punteres
Mòdul 7: Estructures i Unions
Mòdul 8: Assignació Dinàmica de Memòria
Mòdul 9: Gestió d'Arxius
- Introducció a la Gestió d'Arxius
- Lectura i Escriptura d'Arxius
- Posicionament d'Arxius
- Gestió d'Errors en Operacions d'Arxius
Mòdul 10: Temes Avançats
- Directives del Preprocessador
- Arguments de Línia de Comandes
- Llistes d'Arguments Variables
- Multifil en C
Mòdul 11: Millors Pràctiques i Optimització
- Llegibilitat del Codi i Documentació
- Tècniques de Depuració
- Optimització del Rendiment
- Consideracions de Seguretat