GDB - Debugging Beispiel2



Lassen Schreiben wir ein anderes Programm, das einen Kern gedumpten durch nicht ,initialisierte Speicher verursachen.

#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; 
}

Um das Debugging zu aktivieren, muss das Programm mit der Option -g kompiliert werden.

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

Hinweis: Wir sind verwenden g ++ Compiler, weil wir haben verwendet C ++ Quellcode .

Wenn Sie laufen dieses Programm auf Ihrem Linux-Rechner , es wird erzeugen das folgende Ergebnis :

segmentation fault (core dumped) 

Nun lassen wir debuggen es mitHilfe 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) 

Leider das Programm werden nicht Absturz entweder von in der benutzerdefinierten Funktionen, Haupt oder SETINT, so gibt es keine nützlich Spur oder lokale Variable Informationen. In diesem Fall kann es sinnvoll sein, in Einzelschritten durch die Programm.

(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 

Der Wert von * ip ist der Wert der ganzen Zahl, zeigte auf durch IP. In diesem Fall ist es ein ungewöhnlicher Wert und gibt starke Anzeichen dafür, dass es ein Problem gibt. Das Problem in diesem Fall ist, dass der Zeiger wurde nie richtig initialisiert, so dass es bis zu einem gewissen Zufallsspeicherbereich (die Adresse 0x40014e0) zeigt. Durch reines Glück, ist der Prozess der Zuweisung eines Wertes an * ip nicht das Programm zum Absturz bringen, aber es erstellt ist ein Problem, das das Programm stürzt ab, wenn es fertig.

gdb_debugging_examples.htm
Advertisements