Documente Academic
Documente Profesional
Documente Cultură
1. Parte teoretică
Pentru partea practică a acestei lucrări de laborator se va utiliza Debugger-ul
IDE-ului Eclipse. Acesta va fi folosit pentru afișarea valorilor instantanee a variabilelor
declarate în cadrul unui program C.
1
programatorul. Pentru noi la acest pas Debugger-ul va fi util pentru monitorizarea
variabilelor fără a le afișa în consolă.
1.1.1. Crearea și compilarea unui proiect care permite rularea în modul Debug
După cum a fost prezentat în Laboratorul 2, la crearea unui proiect nou se poate
opta pentru variantele Release și Debug. Vom crea un proiect nou, denumit L4_1, care va
avea selectată și varianta Debug (vezi Fig. 8, pag. 8 din L2_referat).
Se va adăuga un nou fișier sursă C denumit ”testDebug.c”. Editați fișierul sursă
pentru a conține codul prezentat în fig.1.
Fig.1.
Salvați fișierul sursă și apoi alegeți comanda ”Build” – ”Debug” prin apăsarea pe
2
Fig.2.
Avertismentele atenționează asupra faptului că în programul compilat sunt declarate
variabile (care vor utiliza spațiu în MO) fără a fi utilizate pentru calcule sau pentru afișare
ceea ce pentru compilator înseamnă risipă de memorie. Pentru această etapă vom ignora
avertismentele respective.
3
- apăsând butonul
În cazul în care lansarea în modul Debug nu este posibilă și este semnalată o
eroare legată despre gdb.exe, se va executa instalarea acestuia conform pașilor din
secțiunea 1.x. Instalare Debugger Eclipse.
La prima rulare a proiectului în acest mod Eclipse va afișa o fereastră de dialog care
va cere programatorului să specifice în ce mod va rula procesul de depanare. Se
recomandă selecția opțiunii ”Local C/C++ Application”, așa cum este prezentat în fig.3.
Fig.3.
4
1 – zona codului sursă unde va fi marcată instrucțiunea ce urmează a fi efectuată
2 – zona în care vor fi afișate valorile tuturor variabilelor programului.
3 – zona de control care permite executarea instrucțiunilor pas cu pas sau oprirea
modului Debug
4 – zona de butoane care pot fi folosite pentru schimbarea Perspectivei (modului de
afișare: inițial era C/C++)
Fig.4.
5
variabile (variabila c de tip char, variabila i de tip int și variabila f de tip float) au deja
valori inițiale (c = 0, i = 2699264 și f = 0), chiar dacă programul este oprit înainte de a
executa instrucțiunea char c = ‘A’;. Trebuie specificat că în acest moment valorile afișate
pentru variabile sunt valorile existente în memorie chiar dacă liniile de alocare variabile
nu au fost executate, acest lucru fiind posibil în modul Debug.
Pentru a executa instrucțiunea curentă (de ex. instrucțiunea marcată în zona 1din
fig. 4), programatorul trebuie să efectueze una din următoarele operații:
- să selecteze din bara de meniuri ”Run” – opțiunea ”Step Over”, sau
- să apese tasta F6, sau
- să apese pe pictograma .
După executarea instrucțiunii curente (char c = ‘A’;) se poate observa modificarea
valorii variabilei c (zona 1 – fig.5) și marcarea următoarei instrucțiuni pentru execuție
(zona 2 – fig. 5). Pentru variabilele de tip char, Eclipse va afișa atât codul zecimal al
octetului cât și codul ASCII corespunzător.
Fig.5
Obs. Afișarea valorilor se face implicit în baza 10, dar prin click dreapta pe numele
variabilei din zona 1, se poate selecta ”Number Format” și apoi se poate opta pentru una
din bazele numerice relevante (Decimal, Octal, Hex, Binary).
6
În continuare se va selecta din nou ”Step Over” (F6) și se va observa modificarea
valorii variabilei i (zona 1 – fig.6) și marcarea următoarei instrucțiuni (zona 2 – fig.6).
Fig.6
Se execută și ultima instrucțiune, iar în Eclipse se poate observa modificarea
variabilei f (zona 1 – fig.7) și trecerea la ultima instrucțiune (zona 2 – fig.7).
Fig.7
Bonus. În zona 1 – fig.7 variabila f primește valoarea 1.34000003, chiar dacă în
sursă scrie f = 1.34. Puteți explica de ce se întâmplă acest lucru?
Prin alegerea operației ”Step Over” se va încheia programul curent dar Perspectiva
Eclipse va rămâne cea de Debug. Pentru a trece la Perspectiva C/C++ se va alege din bara
7
de meniuri Window – Perspective – Open Perspectice – C/C++ sau se va apăsa pe
pictograma C/C++ din zona 4 – fig.4.
Fig. 8
Obs. Închiderea fișierului ”_register….” se poate face și în perspectiva Debug,
urmând ca ulterior să se schimbe Perspectiva în C/C++.
Concluzie. Etapele prezentate sunt prezentate ca exemplu de utilizare a
Debugger-ului, ulterior acestea vor trebui adaptate programului care se va dori analizat.
8
Verificare instalare gdb
Pentru a verifica dacă gdb este instalat se poate căuta în directorul /bin al
TDM-GCC. Acolo, ar trebui să se regăsească fișierele gdb.exe, gdb64.exe,
gdbserver.exe și gprof.exe. În cazul în care gdb nu a fost instalat, acesta se instalează
urmând pașii de mai jos.
Instalare gdb
Se lansează arhiva executabilă utilizată pentru instalarea compilatorului
(tdm64-gcc-5.1.0-2 sau asemănător).
1. La fereastra TDM-GCC Setup se va deselecta "Check for updates ..." și se va
apăsa pe butonul Manage.
9
3. La pasul de selecție a componentelor … se va selecta componenta gdb, ca în figura
de mai jos:
4. Install.
5. Dacă tot nu funcționează debugger-ul, în Eclipse, în fereastra Window -
Preferences - C/C++ - Debug - GDB se adaugă la GDB debugger calea către
fișierul gdb.exe.
10
6. Apply and Close.
11
1.2. Tipuri de date predefinite
În Tabelul 1 sunt prezentate dimensiunile în octeți pentru diferitele tipuri de date
predefinite.
Tabelul 1
12
int main(){
int signedChar;
int signedShortInt;
int signedInt;
int signedFloat;
signedChar = sizeof(char);
signedShortInt = sizeof(short int);
signedInt = sizeof(int);
signedFloat = sizeof(float);
return 0;
}
a. Creați un proiect C în Eclipse, adăugați codul sursă de mai sus, rulați programul în
modul Debug și vizualizați valorile pe care le vor primi cele patru variabile și verificați
corespondența cu Tabelul 1.
b. Completați programul pentru a afișa și dimensiunile (în octeți) pentru variabilele de tip:
unsigned char, unsigned short, long int, long long int, double și long double. Notați valorile pe
caietul de laborator.
Ex.2. Realizați programul care permite crearea variabilei float v și atribuiți acestei
variabile valoarea 2.30. Notați pe caietul de lucru valoarea atribuită. Rulați din nou
programul dar de această dată declarați încă o variabilă de tip double și atribuiți-i aceeași
valoare (2.3). Ce observați? Cum explicați?
float v = 2.3;
double dv = 2.3;
Ex.3. Constantele caracter, adică alfabetul limbajului C/C++ (cifre, litere, semne
speciale: ‘A’; ’c’; ’9’; ’>’ș.a.) se reprezintă prin codul ASCII. Declarația char
specifică faptul că o mărime/variabilă va reține numai un cod ASCII respectiv un
singur caracter.
13
char n= ’a’;
char c = ’Ax’;
2. Întrebări de autocontrol
1. Care este diferența dintre versiunile Release și Debug în IDE-ul Eclipse?
2. Care sunt pașii care trebuie urmați pentru a obține varianta Debug a unui
program și cum se lansează în execuție acest mod de rulare?
3. În ce bază numerică sunt afișate variabilele în modul Debug?
4. Cum putem afla numărul de octeți alocat unui anumit tip de variabilă?
5. Care este diferența dintre variabilele de tip char și unsigned char?
6. Care este diferența dintre variabilele de tip int și long int?
7. Este posibilă salvarea vârstei unei persoane (în ani) într-o variabilă de tip
char? Dar într-o variabilă de tip unsigned char?
8. Considerând variabila char c1, pentru a scrie în octetul corespunzător acestei
variabile numărul 67, una dintre posibilități ar fi: c1 = 67; Enumerați alte
două posibilități pentru a scrie aceeași valoare în octetul respectiv!
Pentru exercițiile de mai jos este indicată rezolvarea pe hârtie și verificarea rezultatului
prin rularea variantei Debug a programelor corespunzătoare.
14
3. Știind că valoarea maximă care poate fi memorată într-o variabilă de tip
unsigned short int este 216-1 (65535) ce valoare va avea variabila c după
executarea următoarelor linii de cod?
unsigned short int c = 33000;
c = c + c;
4. Ce valoare va avea variabila e după execuția următoarei linii de program?
unsigned char e = 7 / 2 - 5;
8. Ce valoare vor avea variabilele de mai jos după execuția următoarelor linii
de program?
int i1, i2, i3, i4, i5, i6;
i1 = 1 > 4;
i2 = 6 == 8;
i3 = i4 = 7;
i5 = i1 && i2;
i6 = i2 || i3;
9. Ce valoare vor avea variabilele de mai jos după execuția următoarelor linii
de program?
unsigned char u1, u2, u3, u4;
u1 = 1 << 4;
u2 = 6 | 8;
u3 = ~7;
u4 = u3 & (u2>>2);
15
4. Exerciții pentru aprofundarea cunoștințelor
1. Cum se modifică baza numerică utilizată pentru afișarea valorilor
variabilelor în modul Debug?
2. Ce valori vor avea variabilele a și b după execuția următoarelor linii de
program? Demonstrați prin rularea unui program asemănător în modul
Debug și justificați răspunsul!
int a;
int main(){
int b;
return 0;
}
16
biți ai lui stareRelee, restul de patru biți fiind 0! Același program (aceeași
formulă de calcul) trebuie să calculeze corect setareRelee pentru orice
valoare a lui stareRelee
Ex.
Dacă stareRelee = 10101010 -> setareRelee = 10100000
Dacă stareRelee = 11111111 -> setareRelee = 11110000
Dacă stare Relee = 00000000 -> setareRelee = 00000000
17
18