Linux – Criando graficos de chamadas C baseado no dump do GCC RTL

ImageEgyptPerlGraphvizCleitonBueno

Recentemente navegando pela internet, vi um post muito legal no blog do Sergio Prado, que pode ser visto em “Gerando um gráfico de dependência de pacotes com o Buildroot“, onde o comando dot que faz parte do Graphviz, foi possível gerar um gráfico com todas as dependências do pacote do processo de build, todo sistema como um todo ou com pacotes isolados, vale a pena conferir o post, pena que não conheci esta ferramenta antes.

Porém, já utilizei uma ferramenta parecida que também utiliza o dot do Graphviz, só que esta gera gráficos das chamadas que o código C realiza, é uma ferramenta já antiga, escrita em Perl por Andreas Gustafsson chamada Egypt. Vamos ver como este cara funciona e como utilizá-lo.

Para fazer o Egypt funcionar, você precisa instalar o graphviz, habilitar o RTL (Register Transfer Language) na compilação do GCC, sendo muito breve, RTL é uma representação intermediaria do código mais próximo ao assembly, e quando compila com esta flag setada é gerado vários arquivos (.c.rtl, c.00.rtl ou c.00.expand) de cada objeto, sendo mais fácil o processamento olhando para este cara que já possui otimização do que o C propriamente dito, do que o código .c propriamente dito.

Então agora, vamos preparar nosso ambiente, abre o terminal e instale os pacotes abaixo:

  Vamos agora baixar o Egypt, descompactar e instalar.

Fácil, não? Agora vamos criar 3 arquivos (main.c, myapp.c e myapp.h) onde irei criar uma aplicação simples com algumas funções e realizar chamadas. Segue o conteúdo de cada arquivo.

  Agora vamos adicionar a flag -fdump-rtl-expand ao nosso GCC em versões antigas deve-se adicionar -dr, e vamos compilar nosso projeto.

Podemos ver nossos .c e .h, o principal que é o binário final e os arquivos 144r.expand gerados de cada objeto um do main.o e outro do myapp.o, vamos testar nossa aplicação.

  Agora vamos ao código do Egypt, para gerar o gráfico.

  Foi gerado um arquivo meuPrograma.svg, abrindo é para aparecer algo como a Figura 1.

EgyptLeftToRightFigura 1 – Primeiro Grafico com Egypt e Dot

Sobre o comando egypt, é bem padrão, interessante são os parâmetros -Grankdir do dot que pode ser LR (Left to Right), RL (Right to Left) e BT (Bottom to Top) seria a orientação do gráfico gerado, e -T o formato que pode ser png, svg, git e dentre outros.

Isso tudo pode ser visto facilmente digitando man dot no terminal do Linux.

Vamos executar o mesmo comando só que trocando LR por BT, e nosso gráfico ficara como na Figura 2. EgyptTopToBotton

Figura 2 – Gráfico do Egypt com orientação BT (Bottom to Top)

Agora, vou modificar a função imprimir criando mais uma condição e chamar dentro da função soma o imprimir e vamos ver o resultado em código e em gráficos. Alteração dos códigos

  Compilando e testando o código:

  Gerando o gráfico novamente.

  Visualizando o gráfico gerado na Figura 3. EgyptTopToBottonAdicionandoImprimirNoSoma

Figura 3 – Gráfico do Egypt com função chamando função

Como podemos ver na Figura 3, agora além do main a função soma() também faz chamada a função imprimir().

Imagina em um projeto grande? Alias, você pode fazer com o projeto inteiro, ou selecionar apenas os objetos dos arquivos que você deseja analisar as chamadas.

Espero que tenham gostado, até a próxima!

Referências

Gerando um gráfico de dependência de pacotes com o Buildroot

http://www.graphviz.org/

http://www.gson.org/egypt/

http://www.gson.org/egypt/egypt.html

Share Button

CC BY-NC-SA 4.0 Linux – Criando graficos de chamadas C baseado no dump do GCC RTL by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.