GDB - Esempio di debug 1
Scriviamo un programma per generare un core dump.
#include <iostream>
using namespace std;
int divint(int, int);
int main()
{
int x = 5, y = 2;
cout << divint(x, y);
x =3; y = 0;
cout << divint(x, y);
return 0;
}
int divint(int a, int b)
{
return a / b;
}
Per abilitare il debug, il programma deve essere compilato con l'opzione -g.
$g++ -g crash.cc -o crash
NOTE: Stiamo usando il compilatore g ++ perché abbiamo usato il codice sorgente C ++.
Ora, quando esegui questo programma sulla tua macchina Linux, produrrà il seguente risultato:
Floating point exception (core dumped)
Troverai un file core nella directory corrente.
Ora per eseguire il debug del problema, avvia il debugger gdb al prompt dei comandi:
$gdb crash
# Gdb prints summary information and then the (gdb) prompt
(gdb) r
Program received signal SIGFPE, Arithmetic exception.
0x08048681 in divint(int, int) (a=3, b=0) at crash.cc:21
21 return a / b;
# 'r' runs the program inside the debugger
# In this case the program crashed and gdb prints out some
# relevant information. In particular, it crashed trying
# to execute line 21 of crash.cc. The function parameters
# 'a' and 'b' had values 3 and 0 respectively.
(gdb) l
# l is short for 'list'. Useful for seeing the context of
# the crash, lists code lines near around 21 of crash.cc
(gdb) where
#0 0x08048681 in divint(int, int) (a=3, b=0) at crash.cc:21
#1 0x08048654 in main () at crash.cc:13
# Equivalent to 'bt' or backtrace. Produces what is known
# as a 'stack trace'. Read this as follows: The crash occurred
# in the function divint at line 21 of crash.cc. This, in turn,
# was called from the function main at line 13 of crash.cc
(gdb) up
# Move from the default level '0' of the stack trace up one level
# to level 1.
(gdb) list
# list now lists the code lines near line 13 of crash.cc
(gdb) p x
# print the value of the local (to main) variable x
In questo esempio, è abbastanza ovvio che il crash si verifica a causa del tentativo di dividere un numero intero per 0.
Per eseguire il debug di un "arresto anomalo" del programma che si è arrestato in modo anomalo e ha prodotto un file principale denominato "core", digitare quanto segue nella riga di comando:
gdb crash core
Poiché questo è per lo più equivalente all'avvio di gdb e alla digitazione del comando "r", tutti i comandi precedenti potrebbero ora essere utilizzati per eseguire il debug del file.