Assert() é só para debug!

Embedded Linux, Programação - No Comments » - Marcelo Veiga Neves - Posted on March, 30 at 8:48 pm

Tenho visto, no meu dia-a-dia, vários programas cheios de assert() no meio do código. Acho legal utilizar a macro assert() para depurar o código, o problema quando o uso desta começa ficar banal e a fazer parte da lógica do programa. Já vi utilizarem assert() para fazer programação defensiva, por exemplo. O assert() é uma ferramenta de depuração e deve ser usado somente durante o desenvolvimento e eliminado após essa fase.

Em sistemas embarcado, onde o tamanho da memória RAM e da Flash são limitados, eliminar os assert()’s pode fazer toda a diferença. A seguir tem um programinha de exemplo que utiliza um assert().

#include <stdio.h>
#include <assert.h>
int main()
{
        int *p = NULL;
        ...
        assert(p != NULL);
        ...
        return 0;
}

Compilando o programa acima com e sem o assert() é possível notar a diferença de tamanho.

[veiga@gandalf]$size test test.assert
text    data     bss     dec     hex filename
796     264       4    1064     428 test
906     268       4    1178     49a test.assert

Essa diferença é para apenas 1 assert(), aumentando o numero para 10, pose-se notar o quão problematico isso pode se tornar.

 [veiga@gandalf]$size test test.assert
   text    data     bss     dec     hex filename
    780     264       4    1048     418 test
   1274     268       4    1546     60a test.assert

O uso do comando strip em programas que contém o assert() não faz muita diferença já que cada macro é substituída por uma string do tipo:

"assertion \"%s\" failed: file \"%s\", line %d\n", \
                               "expression", __FILE__, __LINE__);

Uma maneira de eliminar todos os assert()’s em tempo de compilação é utilizar a opção -DNDEBUG (que elimina as macros de depuração). Por isso, é importante não utilizar o assert() para implementar funcionalidades do programa.

 [veiga@gandalf]$gcc -o test test.c -Wall -DNDEBUG

-veiga

Para mais informações sobre o assert(): http://www.hmug.org/man/3/assert.php

Brincando com o Minix

Operating Systems - 6 Comments » - Marcelo Veiga Neves - Posted on February, 24 at 10:52 am


O Minix é um sistema operacional gratuito, com o código fonte disponível e compatível com a versão 7 do UNIX. Minix foi desenvolvido por Andrew Stuart Tanenbaum (com uma grande contribuição de Bruce Evans), originalmente para compensar a proibição da AT&T contra o estudo de SO baseado no código do UNIX e prover uma ferramenta de ensino para seus alunos. Vale citar que Minix foi escrito do “zero” e apesar de ser compatível com Unix, não contém nenhum código da AT&T e por isso pode ser distribuído livremente.

Este texto tem como objetivo obter informações para a utilização de Minix em um curso de sistemas operacionais. TODOS os processos de compilação, instalação e testes descritos neste relatório foram verificados na prática.

Read the rest of this entry »

Níveis de log do printk() para depurar o kernel pela console

Assim como em programas em C de nível de usuário, que usamos a função printf() como ferramenta de depuração, no kernel é comum utilizar o printk(). ;-) Ainda mais quando se trata de Linux embarcado.

printk() imprime a mensagem em um arquivo de log (normalmente, /var/log/messages) ou diretamente para a console, dependendo da configuração do syslog. No entanto, durante a depuração do kernel é interessante (e bastante produtivo) que algumas mensagens sejam enviadas na console. Isso é possível especificando um nível de log critico, como por exemplo:

printk(KERN_CRIT, "Alguma coisa importante aconteceu aqui...\n");

A mensagem acima deverá aparecer tanto na console quanto no arquivo de log.

Existem oito possíveis níveis de log:

KERN_EMERG
KERN_ALERT
KERN_CRIT
KERN_ERR
KERN_WARNING
KERN_NOTICE
KERN_INFO
KERN_DEBUG

Quando nenhuma prioridade é definida explicitamente, o printk() assume uma prioridade default (DEFAULT_MESSAGE_LOGLEVEL).

Outra coisa útil é poder alterar o nível de log que é enviado para a console, em tempo de execução. Isso pode ser feito através do /proc filesystem da seguinte forma:

echo 8 > /proc/sys/kernel/printk

Isso fará com que TODAS as mensagens do kernel apareçam na console (Note que estamos falando de console mesmo e não um terminal qualquer, tipo xterm ou coisa parecida). Da mesma forma, para fazer com que nenhuma mensagem seja enviada para a console, basta fazer:

echo 0 > /proc/sys/kernel/printk

-veiga

Para mais informações:

Debugging by Printing:
http://book.chinaunix.net/special//ebook/oreilly/ldd3…

Using printk():
http://www.wplug.org/pipermail/wplug/2002-Novemb…

A motivação para criar esse blog!

A vida o universo e tudo mais - No Comments » - Marcelo Veiga Neves - Posted on February, 11 at 6:39 pm

Olá todos,

Recentemente resolvi comprar um domínio e migrar minha página, que ainda estava hospedada na universidade, para um servidor com mais recursos (por sinal da empresa dos guris - ribas, restinga e cechin - recomendo). Aproveitei para reformulá-la e no meio da brincadeira resolvi criar um blog. ;-)

O que vou escrever?

Tem várias coisas interessantes que eu vejo por ai, ou descubro no dia a dia e acabo guardando só para mim. Desde dicas (programação, configuração, depuração do kernel, etc.), artigos, links para ferramentas… até alguns textos que eu mesmo escrevo para organizar as idéias na minha cabeça. ;-) Até agora eu estava mantendo tudo em vários arquivos txt, mas de forma muito desorganizada. Além de não compartilhar o conhecimento, eu acabava perdendo muita coisa no meio da bagunça. Por isso, resolvi organizar esse material em forma de um blog. Mesmo que ninguém nunca leia o blog, eu ainda vou ter minhas coisas bem organizadas e ainda por cima acessível de qualquer lugar. Oops, blog? ;-)

Por que um blog?

Quem me conhece sabe que nunca gostei dessas coisas. Até alguns meses atrás achava que isso era coisa de emo ou de guriazinha de colégio, mas agora tenho que admitir que blog é uma ferramenta bem útil. A minha primeira idéia era simplesmente organizar os textos que eu tinha em txt (com um mínimo de formatação), colocar em um diretório e fazer um scriptizinho para ler esses textos e gerar as páginas. Para atualizar, bastaria eu fazer o upload de um texto novo para o servidor e automaticamente ele entraria no ar. Mas depois que comecei a brincar com o tal do cpanel, vi que não adianta inventar moda… existem muitas ferramentas legais e fáceis de usar. No blog, ainda organizo as coisas em categorias, ganho um ferramenta de busca e posso acessar de qualquer browser. Agora vejo que a minha implicância com os blogs era puro preconceito mesmo! ;-)

[]’s

-veiga

Hello world!

Uncategorized - No Comments » - Marcelo Veiga Neves - Posted on January, 5 at 7:45 pm

Hello world! ;-)

-veiga