Debugando usando .gdbinit

Um excelente recurso do grande GDB é poder criar nossos próprios comandos para auxiliar no debug das aplicações. Fazemos isso num arquivo chamado .gdbinit, a sintaxe é bem simples, porém não encontrei documentação a respeito do suporte do .gdbinit, até então a documentação é ver os .gdbinit que o Google encontrar.
É possível chamar os comandos existentes, obviamente, e tambem declarar variáveis, fazer type-casting, acessar os membros de estruturas, tem um printf, podemos chamar as funções C, e etc.

Vamos a um exemplo de um simples comando para fazer um dump de uma determinada estrutura de uma programa.

define teste_dump
	set $var = $arg0
 
	while $var->nome
		printf "Nome: %s (len=%d)\nIdade: %d\n", $var->nome, strlen($var->nome), $var->peso
		printf "---------------------\n"
		set $var = $var + 1
	end	
end
 
document teste_dump
	dumps a structure
end

O arquivo precisa ser salvo como .gdbinit, ele pode ficar no mesmo dir. do programa ou no dir. home do usuário.

A respeito do $arg0, é bem intuitivo, referente-se ao primeiro argumento fornecido ao comando, que no caso, será o nome da variável. O resto dispensa comentários. :D

Como é notório, na primeira parte está o código de nosso novo comando, e na parte debaixo, a informação sobre o tal comando. (Esta informação aparecerá no help de comandos do GDB, embora este bloco não seja obrigatório no .gdbinit)

Vamos testar o novo comando para fazer o dump de uma estrutura do programa. (O comando foi feito exatamente para essa estrutura, claro!)

#include <stdio.h>
 
int main(int argc, char **argv)
{
	struct {
		const char *nome;
		short int peso;		
	} pessoas[] = {
		{"Felipe",  90},
		{"Diogo",   80},
		{"Gustavo", 70},
		{"Higor",   60},
		{NULL,       0}
	};
 
	return 0;
}

Obs.: Compilar com -ggdb.

gcc -ggdb -o teste teste.c

E então começamos:

$ gdb teste
(gdb) b 15
Breakpoint 1 at 0x80483c6: file teste.c, line 15.
(gdb) r
Starting program: /home/felipe/teste 
 
Breakpoint 1, main () at teste.c:16
16		return 0;
(gdb) teste_dump pessoas
Nome: Felipe (len=6)
Peso: 90
---------------------
Nome: Diogo (len=5)
Peso: 80
---------------------
Nome: Gustavo (len=7)
Peso: 70
---------------------
Nome: Higor (len=5)
Peso: 60
---------------------

É bem interessante! :)

Show, muito bom mesmo. belos

Show, muito bom mesmo.

belos posts ;)

Excelente!

Excelente!

Took me time to read all the

Took me time to read all the comments, but I really love the article. It proved to be very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also engaged! I’m sure you had joy writing this article.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options