Tenho um grande espaço de trabalho que contém muitos arquivos-fonte de código C. Embora eu possa ver as funções chamadas de uma função no MS VS2005 usando o navegador de objetos, e também no MSVC 6.0, isso só mostra as funções chamadas de uma função específica em um tipo de exibição não gráfica. Além disso, ele não mostra a função chamada a partir de say main()
e, em seguida, as funções chamadas a partir dela e assim por diante, mais profundamente na função de nível folha.
Eu preciso de uma ferramenta que me dê um gráfico de chamada de função pictoricamente com funções callee
e caller
conectado por setas ou algo parecido, começando do main()
último nível da função, ou pelo menos mostrando um gráfico de chamada de todas as funções em um arquivo C de forma pictórica. Seria ótimo se eu pudesse imprimir este gráfico.
Alguma boa ferramenta para fazer isso (não precisam ser ferramentas gratuitas)?
fonte
Respostas:
Egito (software livre)
ncc
KcacheGrind (GPL)
Graphviz (CPL)
CodeViz (GPL)
fonte
Métodos de análise dinâmica
Aqui, descrevo alguns métodos de análise dinâmica.
Os métodos dinâmicos realmente executam o programa para determinar o gráfico de chamadas.
O oposto dos métodos dinâmicos são os métodos estáticos, que tentam determiná-lo apenas a partir da fonte, sem executar o programa.
Vantagens dos métodos dinâmicos:
Desvantagens dos métodos dinâmicos:
KcacheGrind
https://kcachegrind.github.io/html/Home.html
Programa de teste:
Uso:
Agora você está dentro de um programa de GUI incrível que contém muitos dados de desempenho interessantes.
No canto inferior direito, selecione a guia "Gráfico de chamadas". Isso mostra um gráfico de chamadas interativo que se correlaciona com as métricas de desempenho em outras janelas conforme você clica nas funções.
Para exportar o gráfico, clique com o botão direito e selecione "Exportar Gráfico". O PNG exportado tem a seguinte aparência:
A partir disso, podemos ver que:
_start
, que é o ponto de entrada ELF real e contém boilerplate de inicialização glibcf0
,f1
ef2
são chamados conforme o esperado um do outropointed
também é mostrado, embora o tenhamos chamado com um ponteiro de função. Ele poderia não ter sido chamado se tivéssemos passado um argumento de linha de comando.not_called
não é mostrado porque não foi chamado durante a execução, porque não passamos um argumento de linha de comando extra.A coisa legal sobre
valgrind
é que não requer nenhuma opção especial de compilação.Portanto, você pode usá-lo mesmo que não tenha o código-fonte, apenas o executável.
valgrind
consegue fazer isso executando seu código por meio de uma "máquina virtual" leve. Isso também torna a execução extremamente lenta em comparação com a execução nativa.Como pode ser visto no gráfico, as informações de tempo sobre cada chamada de função também são obtidas e podem ser usadas para traçar o perfil do programa, que é provavelmente o caso de uso original desta configuração, não apenas para ver os gráficos de chamadas: Como posso traçar o perfil Código C ++ em execução no Linux?
Testado no Ubuntu 18.04.
gcc -finstrument-functions
+ etracehttps://github.com/elcritch/etrace
-finstrument-functions
adiciona chamadas de retorno , o etrace analisa o arquivo ELF e implementa todos os retornos de chamada.Não consegui fazer funcionar, mas infelizmente: Por que `-finstrument-functions` não funciona para mim?
A saída reivindicada está no formato:
Provavelmente o método mais eficiente, além do suporte de rastreamento de hardware específico, mas tem a desvantagem de recompilar o código.
fonte
O Understand faz um ótimo trabalho na criação de gráficos de chamadas.
fonte
Nosso kit de ferramentas de reengenharia de software DMS tem análise de gráfico de controle / fluxo de dados / pontos para / chamada estática que foi aplicada a sistemas enormes (~ ~ 25 milhões de linhas) de código C e produziu esses gráficos de chamada, incluindo funções chamadas por meio de ponteiros de função .
fonte
Você pode tentar CScope + tceetree + Graphviz .
fonte
Você pode verificar meu gerador de árvore de chamadas C baseado em bash aqui . Ele permite que você especifique uma ou mais funções C para as quais deseja informações do chamador e / ou chamadas, ou você pode especificar um conjunto de funções e determinar o gráfico de alcançabilidade das chamadas de função que as conecta ... Ou seja, diga-me todas as formas principais ( ), foo () e bar () estão conectados. Ele usa graphviz / dot para um motor gráfico.
fonte
Astrée é a ferramenta mais robusta e sofisticada que existe, IMHO.
fonte