GDB - Exemple de débogage2

Écrivons un autre programme qui provoquera un vidage de mémoire en raison d'une mémoire non initialisée.

#include <iostream>  
using namespace std; 

void setint(int*, int); 
int main() 
{ 
   int a; 
   setint(&a, 10); 
   cout << a << endl; 
   
   int* b; 
   setint(b, 10); 
   cout << *b << endl; 
   
   return 0; 
} 

void setint(int* ip, int i)
{
   *ip = i; 
}

Pour activer le débogage, le programme doit être compilé avec l'option -g.

$g++ -g crash.cc -o crash

NOTE: Nous utilisons le compilateur g ++ car nous avons utilisé le code source C ++.

Lorsque vous exécutez ce programme sur votre machine Linux, il produira le résultat suivant:

segmentation fault (core dumped)

Maintenant laissez-nous le déboguer en utilisant gdb:

$ gdb crash 
(gdb) r 
Starting program: /home/tmp/crash 
10 
10 
Program received signal SIGSEGV, Segmentation fault. 
0x4000b4d9 in _dl_fini () from /lib/ld-linux.so.2 

(gdb) where 
#0  0x4000b4d9 in _dl_fini () from /lib/ld-linux.so.2 
#1  0x40132a12 in exit () from /lib/libc.so.6 
#2  0x4011cdc6 in __libc_start_main () from /lib/libc.so.6 

#3  0x080485f1 in _start () 
(gdb)

Malheureusement, le programme ne plantera pas dans aucune des fonctions définies par l'utilisateur, main ou setint,il n'y a donc aucune trace utile ou information de variable locale. Dans ce cas, il peut être plus utile d'effectuer une seule étape dans le programme.

(gdb) b main 
# Set a breakpoint at the beginning of the function main 

(gdb) r 
# Run the program, but break immediately due to the breakpoint. 

(gdb) n 
# n = next, runs one line of the program 

(gdb) n 
(gdb) s 
setint(int*, int) (ip=0x400143e0, i=10) at crash2.C:20 
# s = step, is like next, but it will step into functions. 
# In this case the function stepped into is setint. 

(gdb) p ip 
$3 = (int *) 0x400143e0 

(gdb) p *ip 
1073827128

La valeur de * ip est la valeur de l'entier pointé par ip. Dans ce cas, c'est une valeur inhabituelle et une preuve solide qu'il y a un problème. Le problème dans ce cas est que le pointeur n'a jamais été correctement initialisé, il pointe donc vers une zone aléatoire en mémoire (l'adresse 0x40014e0). Par pure chance, le processus d'attribution d'une valeur à * ip ne fait pas planter le programme, mais cela crée un problème qui bloque le programme à la fin.