GDB - Exemplo de depuração 2
Vamos escrever outro programa que causará um despejo de memória devido à memória não inicializada.
#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;
}
Para habilitar a depuração, o programa deve ser compilado com a opção -g.
$g++ -g crash.cc -o crash
NOTE: Estamos usando o compilador g ++ porque usamos o código-fonte C ++.
Quando você executa este programa em sua máquina Linux, ele produzirá o seguinte resultado:
segmentation fault (core dumped)
Agora vamos depurá-lo usando 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)
Infelizmente, o programa não travará em nenhuma das funções definidas pelo usuário, main ou setint,portanto, não há rastreamento útil ou informações de variáveis locais. Nesse caso, pode ser mais útil executar o programa em uma única etapa.
(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
O valor de * ip é o valor do inteiro apontado por ip. Nesse caso, é um valor incomum e é uma forte evidência de que há um problema. O problema neste caso é que o ponteiro nunca foi inicializado corretamente, então ele está apontando para alguma área aleatória na memória (o endereço 0x40014e0). Por pura sorte, o processo de atribuir um valor a * ip não trava o programa, mas cria algum problema que trava o programa quando termina.