Familiarizarea cu GdB depanatorul, dezvoltarea de software pentru Linux
Familiarizarea cu debugger GDB
Familiarizarea cu debugger GDB
Greșeli, din păcate, apar în orice program, indiferent cât de cool un dezvoltator profesionist a fost. Prin urmare, indiferent dacă vă place sau nu, de a utiliza un debugger încă nevoie. forță de viață. Și mai mult timp petrecut pe studiul este acum de lucru cu el, mai mult timp se va economisi în viitor.
Considerăm debugger, software-ul GNU furnizat GDB.
Această compilație se realizează prin adăugarea de pavilion -g pentru a comanda pentru a compila. De exemplu, dacă am merge programul kalkul fără a utiliza Makefile, vom da următoarea comandă:
g ++ main.cpp problem.cpp o- kalkul -g
Dacă vom folosi comanda make, este necesar să se pună opțiunea CFLAGS = -g. Apoi, toate echipele din compilării conținute în Make-fișierul va primi în mod automat de pavilion -g.
Să luăm un program am creat în fișierul main.cpp, problem.cpp și problem.h (am numit atunci proiectul kalkulcpp director). Noi Makefile deja generat. Să le folosim.
Curățați pachetul de rezultatele ansamblului anterior.
Va colecta programul din nou, dar de data aceasta cu includerea de informații de depanare.
Rulați GDB debugger, descărcați-l la programul nostru de depanare. (Dacă vă amintiți, avem un program executabil este în directorul src.)
Pentru a rula programul în interiorul debugger, executați comanda este dată.
Pentru a vedea codul sursă, dat de comanda listă.
Setați un punct de întrerupere pe linia numărul 21. Breakpoint - o etichetă care indică faptul că programul ajunge la acest loc, trebuie să se oprească.
A se vedea, în cazul în care ați stabilit un punct de întrerupere, puteți utiliza comanda info valori critice.
(Dacă se dorește, în loc de un număr de linie pentru a indica numele funcției, atunci programul se va opri în fața funcției.)
Introducem primul număr de 5 și semnul activităților matematice „+“. Programul vine la un punct de întrerupere și de oprire, se deplasează ne o linie la care se află acest punct.
Noi, desigur, să fie interesant să știm exact unde am rămas, și că programul a reușit să realizeze. Dă backtrace de comandă.
Debugger ne oferă următoarele informații:
# 0 CProblem :: Se calculează (acest = 0x804b008) la problem.cpp: 21
# 1 0x08048e00 în CProblem :: Solve (acest = 0x804b008) la problem.cpp: 93
# 2 0x08048efc în principal () la main.cpp: 15
Acest lucru înseamnă că suntem în funcția calculează de funcționare, care este o funcție membră a clasei CProblem. Acesta a fost cauzată de funcția Rezolva aceeași clasă, și că, la rândul său, din funcția principală. Astfel, comanda backtrace afișează întreaga stivă de funcții numite de la începutul programului până la locația curentă.
Să vedem, ce este același lucru în această etapă valoarea numerație.
Și noi imediat afișează numărul 5, pe care am introdus în program. (Valoarea introdusă de noi cu tastatura, o atribuie variabilei.)
Dacă am în loc de imprimare va folosi comanda de afișare, valoarea acestei variabile va fi afișată de fiecare dată când programul este oprit, fără instrucțiuni speciale.
Adăugați un alt punct de întrerupere pe linia 25 problem.cpp fișier.
Vom continua programul.
Să vedem, ce sunt valorile variabilelor noastre numerație, SecondNumeral și funcționare. Dacă vă amintiți, acestea sunt variabile noi declarate în CProblem clasă.
Avem 5, „+“, 2. Trebuie să fie atât. Dar să ne acum „răzgândit“ și valoare mai bine atribuită variabilei SecondNumeral 4. GDB debugger vă permite să chat-ul în timpul programului pentru a modifica valoarea oricărei variabile.
Dacă nu crezi că valoarea sa sa schimbat, puteți verifica.
am ozhidaetm acum că rezultatul este 9. Să rula programul până la sfârșitul anului.
Rezultatul este într-adevăr, 9.
Să ne uberom acum breakpoint nostru. Se pare că am creat două astfel de puncte. Dar acest lucru poate fi verificat.
Unas nu ar trebui să rămână nici puncte de întrerupere. Verificați.
De fapt, nu există unul.
Să mergem acum, să pas prin întregul program (din fericire, am avea un pic).
Am stabilit un punct de întrerupere în rândul zecime din fișierul principal.
Atingerea linia a zecea, se va opri. Acum trecem prin ea, oprindu-se la fiecare linie, folosind comanda pas.
Pentru a evita tastarea de fiecare dată când s-t-e-p, puteți pur și simplu introduceți litera S. De îndată ce programul ajunge la comandă a problemelor> SetValues (), merge imediat în fișierul problem.cpp în cazul în care definiția CProblem-membre ale funcției :: SetValues () și trece codul pentru această funcție. Același lucru este valabil atunci când este vorba de a apela a problemelor> Solve ().
Pentru un apel de funcție, programul nu a fost în ea, și a continuat să fie efectuate numai la nivelul actual al stivei, în loc de comanda pas este data următoare, sau pur și simplu n.
Când am intrat în funcție, dar nu doresc să continue să ia pas cu pas, și vrem să lucreze și ne-a adus înapoi la nivelul anterior al stivei (de exemplu, înapoi la funcția pe care a cauzat), vom folosi comanda finisaj.
Noi oferim o scurtă listă cu cele mai frecvente comenzi depanator GDB. Pentru mai multe informații, puteți, desigur, se referă întotdeauna la descrierea programului integrat (info gdb) sau de orientare cu privire la utilizarea (om gdb).
backtrace - afiseaza tot drumul spre punctul de întrerupere de curent, adică, numele tuturor funcțiilor din main (); cu alte cuvinte, elimină întregul funcțiile stivă;
rupe - stabilește un punct de întrerupere; parametru poate fi un număr de linie sau numele funcției;
clar - elimină toate punctele de întrerupere din nivelul actual al stivei (de exemplu, funcția curentă);
continua - continuă programul din punctul curent până la capăt;
delete - elimină un punct de întrerupere sau de ceas de exprimare;
afișare - adaugă expresie la lista de expresii ale căror valori sunt afișate de fiecare dată când programul se oprește;
finisaj - execută programul pentru a ieși din funcția curentă; Se afișează valoarea de întoarcere, dacă este cazul;
info breakpoint - afișează o listă a tuturor breakpoints disponibile;
info watchpoints - afișează o listă a tuturor expresiei de control disponibile;
Lista - afișează codul sursă; ca parametru transmis nume de fișier sursă, apoi prin colon, începutul și sfârșitul liniei numărul;
următor - pas prin program, dar, spre deosebire de etapa de comandă, nu efectuează apeluri pas cu pas funcția;
print - imprimă valoarea unei expresii (expresie a trecut ca parametru);
rula - rulează un program de execuție;
set - setează noua valoare a variabilei
pas - executarea pas a programului;
ceas - stabilește o expresie de referință, programul se va opri imediat ce valoarea de referință a modificărilor de expresie;