Discussão do artigo "Rastreamento, Depuração e Análise Estrutural de Código Fonte"

 

Novo artigo Rastreamento, Depuração e Análise Estrutural de Código Fonte foi publicado:

O complexo inteiro de problemas de criação de uma estrutura de um código executado e seu rastreamento pode ser resolvido sem muitas dificuldades. Esta possibilidade apareceu no MetaTrader 5 devido a um novo recurso da linguagem MQL5 - criação automática de variáveis de tipo complexo de dados (estruturas e classes) e sua eliminação quando fora do escopo local. O artigo contém a descrição da metodologia e a ferramenta pronta para uso.

Autor: o_O

 

Ah, sim, Pushkin, sim, filho da mãe.

Esse é um ótimo artigo. Um endoscópio de verdade.

Com certeza vou usá-lo em grandes projetos. Levo 24 horas para descobrir onde está o erro.

O depurador é bom, mas o rastreamento fornece uma imagem completa da passagem do sinal.

 
Sim, bom artigo. Obrigado, Alex.
 

De nada, tentei fazer o melhor para você. :)

Pretendo manter e tentar expandir a funcionalidade desse sistema. Se houver necessidade de algo, escreva.

-----

Para maior clareza, acho que é necessário falar sobre dois pontos puramente técnicos.

1. No arquivo Trace.mqh, é criada uma única instância do rastreador (na parte inferior do arquivo).

extern CTraceCtrl* m_trace; // uma única instância do rastreador

Graças à diretiva extern, a instância será apenas uma. Ou seja, ela não depende de quantos arquivos #include "Trace.mqh" estão incluídos no arquivo #include "Trace.mqh"


2.
A classe CTraceView é usada no CTraceCtrl apenas por um único motivo: para desenvolver a função CTraceCtrl::Break.
Ou seja, para ter uma reação aos cliques do usuário em um loop while (true)

 

Adicionado o processamento da macro __PATH__ (build 420), em conexão com o qual todas as classes são atualizadas.

O botão para abrir um arquivo de nó foi adicionado à janela INFO.



A abertura é realizada pelo comando ShellExecute , portanto, a permissão de importação de DLL é necessária para que as classes funcionem

Arquivos anexados:
MQL5.zip  23 kb
 

funcionalidade adicionada para acrescentar a descrição do nó.

Agora, nas macros _IN, é possível adicionar uma descrição adicional, por exemplo, para exibir as condições de entrada em um nó ou alguma informação relevante.

Essa descrição é atualizada dinamicamente na exibição da árvore.

Exemplo de código:

void OnTick()
  { _IN("");
   static datetime limit_time=0; // tempo de processamento da última negociação + tempo limite
//--- não processar se houver tempo limite
   if(TimeCurrent()>=limit_time)
     { _IN2(TimeCurrent()+">="+limit_time);
      //--- verificação de dados
      if(Bars(Symbol(),Period())>2*InpMATrendPeriod)
        { _IN3(Bars(Symbol(),Period())>2*InpMATrendPeriod);
         //--- alterar o tempo limite pelo tempo limite em segundos se processado
         if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
//---
  }


Um exemplo de como as informações serão exibidas


Botão para ativar a exibição da descrição - canto superior direito "i"

Arquivos anexados:
MQL5.zip  23 kb
 

1. Adição de uma classe CPropertyView separada para exibir as propriedades dos nós.

2. Todas as funções substituídas de classes são tornadas virtuais, de modo que todas as classes são atualizadas.

3. Foram adicionadas duas novas propriedades à classe CNode.
m_edit - sinal do campo editável no CPropertyView
m_brkuse - número de chamadas para o nó, no qual a função CTraceCtrl::Break é interrompida e chamada. 3.

3. De acordo com as notas de Urain no fórum, foram adicionadas duas possibilidades de uso de paradas de código.
- ativar/desativar paradas (botão vermelho D)
- parar por número especificado de invocação de nó

а. A definição do número inicial m_brkuse no nó pode ser feita usando uma macro (no arquivo Trace)

#define _BRKUSES(u)     if (!NIL(m_trace)) if (!NIL(m_trace.m_cur)) ........

b. Ou diretamente na janela de propriedades do nó, no campo"DebugBreak after", que especifica o número necessário de chamadas antes de parar



4. Para descarregar o fluxo de mensagens e acelerar o processamento, as seguintes mensagens são desativadas no indicador!TraceAgent:

CHARTEVENT_CLICK
CHARTEVENT_KEYDOWN
CHARTEVENT_OBJECT_DELETE
CHARTEVENT_OBJECT_CHANGE
CHARTEVENT_OBJECT_CREATE

5. Pequenas alterações cosméticas no mapeamento da árvore

Arquivos anexados:
MQL5.zip  27 kb
 

Excelente artigo, obrigado, Sergeev!

Existe alguma maneira de usar esse mecanismo em scripts?

 
denkir:

Existe alguma maneira de usar esse mecanismo em scripts?

Acho que sim. Mas geralmente em scripts o código não é muito ramificado (a menos, é claro, que o script esteja em um loop).

Além disso, há um inconveniente: o evento OnChartEvent não é tratado em scripts.

 
sergeev:

Acho que sim. Mas, normalmente, nos scripts, o código não é muito ramificado (a menos, é claro, que o script esteja em um loop).

Além disso, há um inconveniente: os scripts não manipulam o evento OnChartEvent.

E se meu script usar muitas classes diferentes, hierarquias de classe?

Acho que é necessário aprimorar a ferramenta para scripts também...

 

A classe CTraceView não se importa com quem a chama, ela criará uma árvore e a exibirá.

Mas os scripts têm um problema de feedback insolúvel. Você não poderá trabalhar ativamente com a árvore.