Strumenti Utente

Strumenti Sito


fisica:informatica:201617:esercitazione7.2

Esercitazione debugging

I lucidi introduttivi per il debugging. Eseguire con i debugger ddd e/o gdb e trovare il problema nei seguenti programmi.

Esercizio 1: Aggiornamenti

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#define N 5
 
/* globali */
int z[N+1];
int a[N-1];
int i;
 
void aggiorna (int k);
 
int main(void)
{
  srand(time(NULL));
  i=0;
  while (i<N)
    {
 
      aggiorna(i);
 
      printf("iterazione %d\n",i);
      i++;
    } 
  printf("exiting ...\n"); 
  return 0;
}
 
void aggiorna (int k) {
  a[k]=rand()%2;
  z[k+1]=a[k];
}

in pratica il codice, salvato in “file.c” compilato con

gcc -Wall -pedantic -o ese file.c

ed eseguito con

$ ./ese

va inspiegabilmente in ciclo all'interno del ciclo. Per eseguire in modalita' interattiva di debugging:

  • Compilare con opzione “-g”, ad esempio
    gcc -Wall -pedantic -g -o ese file.c
  • lanciare l'eseguibile usando il debugger come in
    $ ddd ./ese

* oppure in

$ gdb ./ese

a questo punto e' possibile fermare il programma durante la sua esecuzione, ispezionare le variabili etc..

Esercizio 2: Debuggare codice altrui ...

Per i solutori piu' che abili. Trovare l'errore…

#include<stdio.h>
#include<string.h>
 
 
void leggi( char *[]);
void stampa(char *[], int);
 
int main()
{
  char *a[3]={"alberello","rosea","roma"};
  char *b = NULL;
 
  leggi(a);
 
  return 0;
 
}
 
void stampa(char *arch[],int sizeA)
{
  int i;
 
  printf("i loro indirizzi sono:\n");
 
  for(i=0;i<sizeA;i++)
    printf("%p\n",(void*)&arch[i]);
 
 
}
 
void leggi(char *archivio[]){
  int i;
  int size=strlen(*archivio);
 
  for(i=0;i<size;i++)
    printf("%s\n",archivio[i]);
 
 stampa(archivio, size);
}
fisica/informatica/201617/esercitazione7.2.txt · Ultima modifica: 13/03/2017 alle 15:14 (7 anni fa) da Susanna Pelagatti