Tarefa de rastreamento (construção de um gráfico de função)

 

Suponha que tenhamos algum código (funções, classes, etc.)

A tarefa é criar uma pilha de chamadas. Mas não apenas uma linear - como uma árvore .

Onde o nó de árvore será a entrada de função e os ramos serão as chamadas das seguintes funções a partir do nó de função atual.

Por exemplo, existe uma tal estrutura de funções:

void Main() {  A(); B(); }

void A() { /*вошли в А*/ a(); b(); c(); }
void B() { /*Вошли в B*/ a(); b(); c(); }

void a() { /*Вошли в а */ }
void b() { /*Вошли в b */ }
void c() { /*Вошли в c */ }

O resultado será o seguinte


Condição Obrigatória:

Você pode adicionar apenas uma função às funções de código existentes para organizar o rastreamento - logo após "{".
Não altere de forma alguma os parâmetros de entrada das funções da fonte, nem seus resultados ou código interno.

Esta condição é necessária para não fazer grandes modificações no código, mas apenas para inserir uma e a mesma função de rastreamento (por exemplo, vamos nomeá-la _TRACE_IN_) em todas as funções de código existentes. Para obter todos os passes do código fonte e construir a árvore de chamada.


Eu ficaria feliz em ouvir quaisquer idéias ou variantes.
Não importa como eu o giro, eu me deparo com um círculo vicioso, quando tenho que chamar não uma, mas duas funções para formar tal árvore. Mas posso precisar de apenas um. :)

 

Portanto, você quer fazer um programa para detectar o algoritmo da fonte.

Eu costumava fazer algo semelhante para mim quando estava quebrando os programas de outras pessoas em Asm, mas não entendo sua abordagem...

por que sob a forma de uma árvore?

ou talvez eu não entenda.

 
FLET:

Isto é, você quer fazer um programa para detectar o algoritmo da fonte.
Eu fiz algo semelhante para mim mesmo quando estava quebrando os programas de outras pessoas em Asm, mas não entendo sua abordagem...
por que como uma árvore?
ou algo que não entendo.


Eu não estava pensando em "quebrar". Mas você acertou. Isto é para a construção de uma estrutura de código lógica.

Ou seja, minha tarefa - quando ligo um código de trabalho (meu ou de outra pessoa ou, por exemplo, da entrega padrão do MT5) - em uma janela separada recebo toda a pilha de funções chamadas como uma árvore. Ou seja, na raiz - início da função () e a partir daí sobe e sobe....

Eu implementei a árvore há muito tempo. Possui análise do tempo gasto em funções (para análise da qualidade do código), número de chamadas para funções, rastreamento de valores variáveis e assim por diante. Eu também implementei três opções de exibição desta árvore - como o que é mostrado na imagem da tela e como um gráfico circular e de linhas. Mas eu fiz tudo isso por pequenas coisas.

A principal tarefa que eu enfrentei foi preencher a própria estrutura de árvore.

Eu preciso de uma idéia de como usar uma função (ou talvez várias atribuições, mas o principal é que elas estão em fila), adicionadas à função do código fonte, para construir uma estrutura como na captura de tela.

 
sergeev:

Preciso de uma idéia de como construir uma estrutura como aquela na telacom apenas uma função, acrescentada ao início das funções do código.

A prova de impossibilidade de uma idéia serve?
 
MetaDriver:
A prova de impossibilidade de uma idéia servirá para o truque?

will.... Mas somente após 3 páginas de discussão de opções :))

implementações complexas, variáveis extras, uso de global, ou o que quer que seja. aceitar tudo :)

 
sergeev:

will.... mas somente após 3 páginas de discussão de opções :))
Lan. À espera da página quatro ;-)
 
sergeev:

vale a pena.... mas somente após 3 páginas de discussão de variantes :))


Então a tarefa resumiu-se a preencher o tópico com 3 páginas de texto? :), ok, vamos fazer isso ;)

1. trabalhar com strings: entrar função, adicionar nome da função, excluir saída da função, logar/traçar permanentemente saídas de strings completas como uma lista linear:

start(enter)-func1(enter)-func2(enter)

start(enter)-func1(enter)-func2(exit)

...

esta abordagem, imho, é uma perda de tempo

2. contar manualmente o número de funções no código e este número será um sistema de numeração, ou seja, em um código de 10 funções = base 10, em um código de 3 funções = base 3, usando álgebra booleana, ou talvez mais fácil usando matrizes, realizar operações de exclusão ou incluir na entrada/saída de uma função

mais ou menos assim, mas, mais uma vez, imho - vale a pena o trabalho? é muito trabalho a ser feito.

 

IgorM:

Então a tarefa foi reduzida a preencher o tópico com 3 páginas de texto? :), OK, aqui vamos nós ;)

hey, não tão quente!!! estamos contando cada página aqui :)

1. trabalhar com cordas: entrar uma função, adicionar um nome de função, sair da função, apagá-la,

não se ajusta à condição. Você precisa de uma chamada - na entrada. É irrealista na saída. Pode haver vários pontos de saída em uma função. Mas há apenas uma entrada. Portanto, a "adição" deve estar apenas na entrada.
 
sergeev:

hey hey, não tão quente!!! temos todas as páginas contadas aqui :)

tarde demais, seu desejo foi manifestado por você ;)

sobre o ponto - acho que você ainda precisa trabalhar com matrizes/arquivos multidimensionais - então você terá um modelo matemático de seu traço, e como você lidará com os eventos de entrada/saída da função é outra questão

 
IgorM:

tarde, seu desejo foi manifestado por você ;)

Você sempre pode enterrar um ramo. E isto não é um desejo.

para o ponto - eu acho que você ainda precisa trabalhar com matrizes/arquivos multidimensionais - então haverá um modelo matemático de seu traço, e como você irá lidar com os eventos de entrada/saída da função é outra questão

Eu não entendo muito bem. Você pode explicar em seus dedos como as matrizes se encaixam aqui?

A idéia é colocar as funções em um gráfico (uma árvore no vernáculo). Mas em uma clara ordem cronológica de chamadas e identificação do que foi chamado. Uma e a mesma função pode ser chamada tanto do início quanto do início. Isto é o que precisamos consertar.

(estou desenvolvendo-o para/em MQL5, portanto uso classes para gráficos)

 
sergeev:

gráfico (árvore no vernáculo).

Uma árvore é um caso especial de um gráfico.
Razão: