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.
O comando "Display", muito útil, realiza a mostra de dados automática quando um ponto de parada é atingido. Isso evita termos de ficar utilizando o famoso e trabalhoso "print"(ou "p").
Da mesma forma que os "breakpoints", podemos ver os displays já definidos com a ajuda do comando "info". Vejamos um exemplo:
(gdb) info display
There are no auto-display expressions now.
Ops! Não temos nenhum display definido, pois então vamos definí-lo. O "display" tem funcionamento muito parecido aos "breakpoints". Ele pode receber tanto o nome de uma função, como de variáveis. Como também endereços de variáveis, mas essa não utilizo e nem ao menos cheguei a testar.
(gdb) display bla
1: bla = {void (void)} 0x80483c4 <bla>
(gdb) display x
No symbol "x" in current context.
(gdb) display bla.x
2: bla.x = Attempt to extract a component of a value that is not a structure.
Disabling display 2 to avoid infinite recursion.
No exemplo acima definimos um único display para nos mostrar o que "bla" guarda. Não podemos definir um display para o "x" porque ele só existe localmente. Aqui demonstramos a tentativa de um "espertinho" que resulta em falha, pois "bla" não é uma estrutura. Logo, o "display" 2 é criado e automaticamente desabilitado.
Vamos rodar isso!
(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);
1: bla = {void (void)} 0x80483c4 <bla>
(gdb)
Agora, vamos definir o "display x" e fazer alguns "nexts" e depois utilizar "finish".
(gdb) display x
4: x = -1073743948
(gdb) n
3
8 x += 50;
4: x = 3
1: bla = {void (void)} 0x80483c4 <bla>
(gdb) n
9 printf("X = %d\n", x);
4: x = 53
1: bla = {void (void)} 0x80483c4 <bla>
(gdb) finish
Run till exit from #0 bla () at teste.c:9
X = 53
main () at teste.c:15
15 }
1: bla = {void (void)} 0x80483c4 <bla>
(gdb)
Como deveríamos saber quando fazemos "finish", o próximo ponto de parada já é considerado fora da função (mesmo estando na ultima linha dela "}"). E por isso o nosso "display x" não aparece. Vamos ver nossos "displays" atuais.
(gdb) i display
Auto-display expressions now in effect:
Num Enb Expression
4: y x (cannot be evaluated in the current context)
3: n bla->x
2: n bla.x
1: y bla
Aqui podemos ver algumas coisas interessantes, o "1" é um display para a função bla e esta ativo("y"). Já o "4", também esta ativo. Mas, fora do contexto(ele é uma variável local e estamos fora da função).
Como expliquei anteriormente, o "display" funciona muito parecido com o "breakpoint". Assim, para remover um "display" criado anteriormente passamos o número dele para uma função que é chamada "undisplay". Assim:
(gdb) undisplay 4
(gdb) undisplay 1
(gdb) i display
Auto-display expressions now in effect:
Num Enb Expression
3: n bla->x
2: n bla.x
E para remover todos os "displays" de uma única vez basta utilizar o comando "undisplay" sem parâmetros e confirmar!
(gdb) undisplay
Delete all auto-display expressions? (y or n) y
(gdb) i display
There are no auto-display expressions now.
[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!!!