Neste artigo falarei de backtrace. O que é? Como usar? Pra que serve? Também explorei um pouco mais sobre breakpoints e alguns comandos para controlar o fluxo do programa em execução. Tudo isso no nosso depurador favorito, o GNU Debugger.
Bom, estamos chegando já no final do nosso conteúdo. Mas vamos dar uma olhada se temos algum "breakpoint" esquecido já criado.
(gdb) i b
Num Type Disp Enb Address What
3 breakpoint keep y 0x080483ca in bla at teste.c:7
breakpoint already hit 1 time
Opa! Temos um na linha 7, perfeito! Vamos deixá-lo aí para nossa explicação... reinicie a execução do programa com o comando "run" e confirme.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/rlucca/C/t/a.out
Breakpoint 3, bla () at teste.c:7
7 scanf(" %d", &x);
Ótimo, antes de iniciar a expôr o "backtrace", vamos falar do seu conceito. Conforme seu código vai chamando funções em funções, estas são postas em algum lugar que informa que a função tal chamou a X na linha Z. Do mesmo modo, se função X chamar a função Y na linha S esses dados também terão que ser guardados de um jeito que a maquina possa resgata-los sempre na ordem correta. Para isso, é utilizado uma pilha para guardar essas informações (origem, linha e destino digamos) e essa pilha é chamada de "backtrace"! Vejamos o exemplo:
(gdb) backtrace
#0 bla () at teste.c:7
#1 0x0804840e in main () at teste.c:14
Como havia explicado, o "backtrace" funciona como uma pilha. O conceito de funcionamento de uma pilha é "O ultimo que entra é o primeiro a sai". Por isto que a nossa "main()" é a última da lista, pois foi a primeira a ser chamada e, assim, deve ser sempre.
Do mesmo modo, que podemos abreviar comandos o "backtrace" pode ser abreviado para "bt". O "backtrace" também é conhecido como o comando "where" (abreviação: "whe"), pois informa a função que estamos atualmente como "#0".
Agora que já sabemos onde estamos no nosso programa podemos utilizar as funções "up" e "down" para ir e vir pelo "backtrace".
Vejamos um exemplo:
(gdb) p x
$1 = -1073743948
(gdb) up
#1 0x0804840e in main () at teste.c:14
14 bla();
(gdb) p x
No symbol "x" in current context.
(gdb) down
#0 bla () at teste.c:7
7 scanf(" %d", &x);
(gdb) p x
$2 = -1073743948
(gdb)
Antes do "up" estamos na função "bla" e, assim, conseguimos ter acesso a variável local "x" para imprimí-la. Mas quando realizamos o "up" passamos para a função "main" onde não existe "x". Por fim, voltamos para a função "bla" utilizando o comando "down" onde conseguimos imprimir o valor de "x".
Isso pode ser muito útil, pois em programas uma função chama outra com parâmetros específicos. Não pensando no pior, podemos voltar dá função com possível problema e ver se os parâmetros passados para ela estão corretos. Se estiverem começamos a depurar a função com problema realmente. :)
[3] Comentário enviado por jllucca em 24/09/2004 - 13:23h
Aew, 'brigado pelos elogios y2h4ck e engos!
Sobre o "winheight" tava falando com o y2h4ck que em algumas maquinas que utilizo não achei ele(gdb 5.4). Deve ser porcausa das versões desatualizadas... Verifica se voce está com a versão 6.1.1, pois foi nessa que fiz o artigo :)
[5] Comentário enviado por macroney em 27/09/2004 - 14:40h
parabéns !
muito bom !!!
embora nem li tudo .......
mas vale ...
pô !, alguém conhece algum livro ou tem alguma apostila sobre Assembly , encontrei um em pt_BR , é novo, mas é muito superficial... eu acho ( embora nem programo em assembly) , Pois peguei uma apostila e me parece boa...
[6] Comentário enviado por wildtux em 16/01/2014 - 11:39h
Sei que o tópico é antigo. Mas mesmo assim parabéns pela iniciativa, está me ajudando muito a tirar algumas dúvidas, uso linux e gosto de usar também o cygwin.
Dica1: Pra quem ainda não se aventurou em Assembly, existem vários sites que ensinam sobre alguma coisa. Existem também alguns livros do autor Jon Erickson é só dar uma pesquisada.
Dica2: Pra quem quer debugar arquivos .exe no cygwin é só seguir o mesmo procedimento trocando o a.out pelo a.exe gerado no cygwin full.
Abraço ao jllucca, valeu cara! =D. Viva a comunidade, viva ao Linux!!!