Usando GDB no modo “Terminal User Interface”

A principal ferramenta de debugging que uso é o GDB. Para quem está acostumado em trabalhar, desenvolvendo, apenas usando IDEs como o Eclipse ou o Visual Studio, o GDB pode parecer muito estranho. Uma vez carregado o programa, compilado com informações de debugging, tudo o que aparece na sua frente é um prompt “(gdb)”:

$ ls
hello.c
$ gcc -g -O0 -o hello hello.c
$ gdb hello
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/frederico/Temp/sandbox/tests/hello...done.
(gdb)

Em essência, todo o processo de debugging restringe-se a inserir pontos de parada (breakpoints) no programa, verificar variáveis e outras informações, e continuar o programa (de preferência, passo a passo). Não vou mostrar aqui como lidar com o GDB, mas indico a literatura sobre isso abaixo. O que quero mostrar são dois recursos interessantes do GDB. Começando com a versão 6, o GDB possui um recurso chamado TUI (Terminal User Interface). Basta chamar o gdb da mesma forma como mostrei acima adicionando a opção “-tui”:

$ gdb hello -tui

O gdb aparecerá para você dessa forma:

GDB em modo TUI

Daí pra frente é usar comandos. Para aprender, leia isso aqui. E tem também esse livro aqui.

Suponha que seu programa exiba muitas strings ou, ainda, use libraries como a ncurses. Debugar com o GDB pode ser problemático nessa sitação. Tudo o que vocẽ tem que fazer é desviar o I/O do terminal do GDB para outro terminal. Você pode obter o “device” onde localiza-se o terminal com o comando (no shell) “ps”:

$ ps
  PID TTY       TIME CMD
12195 pts/1 00:00:00 bash
15616 pts/1 00:00:00 ps

Quando você abre outro terminal, o “pts/#” muda. Suponha que um outro terminal aberto seja “pts/2”, no GDB você só tem que fazer:

(gdb) tty /dev/pts/2

E toda a entrada (stdin) e saída (stdout, stderr e stdaux) são redirecionadas para este outro terminal, enquanto vocẽ trabalha calmamente no terminal “pts/1”.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s