This is an old revision of the document!


Laborator 4 - GDB

Introducere

GDB, sau (G)NU (D)e(B)ugger, este un utilitar ce poate fi folosit pentru a vedea ce se întâmplă înăuntrul unui program în timp ce acesta rulează sau pentru a putea vedea starea în care se află programul la momentul în care a crash-uit.

GDB este folosit în principal pentru a depana programe scrise în C sau C++. Acesta poate fi folosit în două moduri pentru a depana un program:

- rulându-l folosind comanda gdb - folosind fişierul core generat în urma unei erori grave (de obicei segmentation fault)

În acest laborator vom analiza doar prima modalitate de depanare.

Rulare GDB

Pentru exemplificare considerăm următorul program:

bug.c
int add(int a, int b)
{
    int c;
    c = a + b;
    return c;
}
 
int main(int argc, char **argv)
{
	char *bug = 0;
	bug[2] = add(2, 4);
	return 0;
}

După compilare, observăm că la executarea programului se produce un segmentation fault.

$ gcc bug.c -o bug
$ ./bug
Segmentation fault (core dumped)

gdb este unealta potrivită pentru astfel de situații. Ca să aflăm la ce linie a avut loc acest segmentation fault, mai întâi trebuie să revenim la pasul de compilare și să activăm simbolurile de depanare folsind opțiunea -g a compilatorului gcc:

$ gcc -g bug.c -o bug

În continuare, rulăm programul folosind gdb:

$ gdb bug
[...]
(gdb) run
Program received signal SIGSEGV, Segmentation fault.
0x000000000040054f in main (argc=1, argv=0x7fffffffe038) at bug.c:13
13		bug[2] = add(2, 4);
(gdb)

Simbolurile de depanare nu sunt în mod implicit adăugate deoarece prin adăugarea acestora, executabilul rezultat va avea o dimensiune mai mare. Folosiți opțiunea -g doar în faza de dezvoltare.

  $ gcc exemplu.c -o exemplu
  $ gcc -g exemplu.c -o exemplu_debug
  $ ls -l
  -rwxrwxr-x. 1 student student 6.0K Dec  7 23:55 exemplu
  -rwxrwxr-x. 1 student student 6.8K Dec  7 23:55 exemplu_debug

Comenzi de bază GDB

TODO

Exerciții și aplicații

  1. Folosiți gdb pentru a depana următorul program C:
    divide.c
    #include <stdio.h>
     
    int divide(int a, int b)
    {
        printf("Dividing %d by %d\n", a, b);
        return a / b;
    }
     
    int main(void)
    {
        int x, y, result;
     
        x = 10; y = 2;
        result = divide(x, y);
        printf("%d\n", result);
     
        x = 5; y = 0;
        result = divide(x, y);
        printf("%d\n", result);
     
        return 0;
    }
  2. TODO
ii/lab/laborator4.1481148372.txt.gz · Last modified: 2016/12/08 00:06 by iulian_gabriel.radu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0