Enrere Mòdul 4
Fonaments de Programació. Llenguatge C/C++---
Pràctica  Resum teòric Exercicis
Pràctica d'ampliació

 

ANNEX: LA DEPURACIÓ

Abans de produir la versió definitiva d'un programa hem de procurar que aquest estigui lliure d’errors. En el moment de la compilació, el compilador ens pot avisar d’alguns errors de sintaxi, confusió de tipus, etc. Aquests errors que pot detectar el compilador s’anomenen errors de compilació, i gairebé sempre són fàcils de detectar.

Si per al compilador la sintaxi del programa és correcta, però aquest no fa exactament el que hauria de fer, pot ser degut, segurament, a un error lògic o error d’execució. Aquests tipus d'errors són els realment difícils de detectar. Per ajudar a detectar-los es fa servir un dels elements més valuosos de l’entorn Visual C++, el depurador o debuger.

Versions d’un programa

Ja hem parlat al primer mòdul, que el Visual C++ pot crear diferents versions d’un programa executable. Fonamentalment hi ha dos tipus de versions: la versió Release (preparada per a la publicació) i la versió Debug (preparada per a la depuració).

La versió Release és una versió optimitzada. Aquesta versió és ràpida i ocupa poc espai. La versió Debug conté informació necessària per tal de permetre la depuració, això sí, a costa de fer executables llargs i lents.

El procediment habitual és produir sempre programes amb la versió Debug en les fases de desenvolupament fins que ens assegurem que no hi ha errors (cosa que mai es pot assegurar 100%), una vegada que el programa s’ha provat i funciona correctament, ja es pot esborrar la versió Debug i produir la versió Release.

La selecció d’una o altra versió es fa abans de la compilació. Si la barra d’eines Build és visible, es pot observar a la part superior d’aquesta barra un quadre combinat amb la qual es pot seleccionar una o altra opció. També es pot canviar de configuració des del menú Build ->set active configuration.

 

Errors i advertiments de compilació

Una vegada acabada l'escriptura del codi del programa es construeix l'aplicació. Ja havíem mencionat que aquesta tasca es pot fer directament amb l'opció build (F7) o en dos passos: compile i build. En qualsevol cas, tots els errors detectats pel compilador, així com altres advertiments, es mostren a la finestra de sortida (Output), particularment a la pestanya Build d'aquesta finestra.

El compilador ens pot donar dos tipus de missatges: els errors i els advertiments (warnings).

Un error impedeix la construcció de l'executable. El compilador ens informa del tipus d'error i la línia en la qual es produeix l'error. S'ha de tenir en compte que no tots els errors són independents, això vol dir que és probable que un mateix error produeixi més d'un missatge d'error, per exemple, si no declarem una variable, el compilador detectarà un error cada vegada que aparegui en el codi aquesta variable.

Els errors més freqüents que es sol cometre i que detecta el compilador són:

  • oblidar tancar parèntesis de funcions.
  • canviar () per [].
  • oblidar un punt i coma darrera d'una instrucció.
  • oblidar tancar les claus d'un bloc.
  • errors de sintaxi, per exemple escriure print() en lloc de printf().
  • fer servir funcions de biblioteca sense incloure els corresponents fitxers de capçalera.
  • en les operacions, oblidar-se del símbol de multiplicar, és a dir, escriure 2x en lloc de 2*x.
  • etc.

A més d'aquests errors que obliguen a corregir el codi i tornar a compilar o construir l'aplicació, el compilador ens avisa d'algunes circumstàncies que, encara que no impedeixen la construcció de l'aplicació, poden ser errors que s'han de corregir. Per exemple, el compilador ens avisarà si:

  • fem servir una variable local abans d'inicialitzar-la.
  • fem conversions automàtiques de tipus que poden fer perdre informació.
  • etc.

Si tot a anat bé i el compilador ha fet la seva tasca sense detectar cap error, ja s'ha creat el fitxer executable, aquest fitxer, si s'ha creat amb la versió DEBUG, es pot provar amb eines que permeten detectar comportaments no desitjats.

Depuració

Per tal de fer servir el depurador o debug hem de seleccionar l'opció Go (F5).  Això permet fer que el programa s'executi fins a un punt determinat i, a partir d'aquest moment, el depurador pren el comandament de l'execució. Si premem F5 o seleccionem GO abans de compilar o construir el programa, primer es compila i es construeix l'aplicació i després s'executa.

Per forçar que el programa s'aturi en un punt determinat del codi hem de col·locar un punt de ruptura o breakpoint. Es poden col·locar tots els punts de ruptura que s'estimi necessaris. La forma més ràpida de col·locar un punt de ruptura és prement la tecla F9 quan el cursor està sobre la línia desitjada. Això farà que al començament de la línia aparegui un punt vermell. La tecla F9 actua com un commutador, és a dir, si premem F9 damunt d'una línia marcada, la marca desapareix.

Quan l'execució del codi s'atura perquè ha trobat un punt de ruptura, l'opció Buid del menú es substitueix per l'opció Debug , que conté, entre altres, opcions per poder executar el programa pas per pas.

Una aplicació usual dels punts de ruptura consisteix en comprovar si s'està executant una part determinada del codi, per exemple, la part interior d'un bucle. Si es col·loca un punt de ruptura en un punt del codi i l'execució no s'atura vol dir que el programa no arriba a passar per aquest punt.

Una vegada seleccionada l'opció GO, si es troba un punt de ruptura, l'execució s'atura. En aquest moment podem observar el valor actual de les variables, per això hi ha diverses formes:

  • situant el cursor damunt el nom d'una variable apareix un quadre amb el valor actual d'aquesta variable.

  • escrivint el nom de la variable desitjada a la finestra WATCH. Aquesta finestra s'activa automàticament en la depuració.

La finestra WATCH té dues columnes, a la primera columna podem escriure el nom d'una variable o expressió. En la segona columna apareix automàticament el seu valor en aquest punt del programa. Es pot modificar els valors de les variables no constants que es mostrin en aquesta finestra.