Discussione sull’articolo "Tracciamento, debug e analisi strutturale del codice sorgente"

 

Il nuovo articolo Tracciamento, debug e analisi strutturale del codice sorgente è stato pubblicato:

L'intero complesso di problemi relativi alla creazione di una struttura di un codice eseguito e al suo tracciamento può essere risolto senza serie difficoltà. Questa possibilità è apparsa su MetaTrader 5 grazie alla nuova funzionalità del linguaggio MQL5: creazione automatica di variabili di tipo complesso di dati (strutture e classi) e loro eliminazione quando si esce dall'ambito locale. L'articolo contiene la descrizione della metodologia e dello strumento già pronto.

Viene scelto un approccio comune come metodo di rappresentazione della struttura – la visualizzazione sotto forma di albero. A tal fine, abbiamo bisogno di due classi informative. CNode - un "nodo" utilizzato per scrivere tutte le informazioni su uno stack. CTreeCtrl - un "albero" che elabora tutti i nodi. E il tracciatore - CTraceCtrl, utilizzato per l'elaborazione degli alberi.

Le classi sono implementate secondo la seguente gerarchia:


Autore: ---

 

Oh, sì, Pushkin, sì, figlio di puttana.

È un articolo fantastico. Un vero endoscopio.

Lo userò sicuramente nei grandi progetti. Mi ci vogliono 24 ore per capire dove si trova l'errore.

Il debugger è buono, ma la traccia fornisce un quadro completo del passaggio del segnale.

 
Sì, ottimo articolo. Grazie, Alex.
 

Non c'è di che, ho fatto del mio meglio per voi. :)

Ho intenzione di mantenere e cercare di espandere le funzionalità di questo sistema. Se ci sarà bisogno di qualcosa, allora scrivete.

-----

Per una maggiore chiarezza, credo sia necessario soffermarsi su due punti puramente tecnici.

1. Nel file Trace.mqh viene creata una singola istanza del tracciatore (in fondo al file).

extern CTraceCtrl* m_trace; // una singola istanza del tracciatore

Grazie alla direttiva extern, l'istanza sarà una sola. Cioè, non dipende da quanti file #include "Trace.mqh" sono inclusi nel file #include "Trace.mqh".


2.
La classe CTraceView è usata in CTraceCtrl solo per un'unica ragione: per elaborare la funzione CTraceCtrl::Break.
Vale a dire per avere una reazione ai clic dell'utente in un ciclo while (true)

 

Aggiunta l'elaborazione della macro __PATH__ (build 420), in relazione alla quale tutte le classi vengono aggiornate.

Nella finestra INFO è stato aggiunto il pulsante per aprire un file nodo.



L'apertura viene eseguita tramite il comando ShellExecute , pertanto è necessario il permesso di importazione della DLL per il funzionamento delle classi.

File:
MQL5.zip  23 kb
 

aggiunta della funzionalità per l'aggiunta della descrizione del nodo.

Ora nelle macro _IN è possibile aggiungere una descrizione aggiuntiva, ad esempio per visualizzare le condizioni di accesso a un nodo o alcune informazioni rilevanti.

Questa descrizione viene aggiornata dinamicamente nella visualizzazione dell'albero.

Esempio di codice:

void OnTick()
  { _IN("");
   static datetime limit_time=0; // tempo di elaborazione dell'ultimo scambio + timeout
//--- non elaborare se il timeout è stato superato
   if(TimeCurrent()>=limit_time)
     { _IN2(TimeCurrent()+">="+limit_time);
      //--- controllo dei dati
      if(Bars(Symbol(),Period())>2*InpMATrendPeriod)
        { _IN3(Bars(Symbol(),Period())>2*InpMATrendPeriod);
         //--- cambiare il tempo limite con il timeout in secondi se elaborato
         if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
//---
  }


Un esempio di come apparirà l'informazione


Pulsante per attivare la visualizzazione della descrizione - "i" in alto a destra

File:
MQL5.zip  23 kb
 

1. Aggiunta di una classe CPropertyView separata per la visualizzazione delle proprietà dei nodi.

2. Tutte le funzioni sovrascritte delle classi sono state rese virtuali, quindi tutte le classi vengono aggiornate.

3. Sono state aggiunte due nuove proprietà alla classe CNode.
m_edit - segno del campo modificabile in CPropertyView
m_brkuse - numero di chiamate al nodo, in corrispondenza del quale la funzione CTraceCtrl::Break viene interrotta e richiamata. 3. Sono state aggiunte due nuove proprietà.

3. Secondo le note di Urain sul forum, sono state aggiunte due possibilità di utilizzo degli arresti di codice.
- abilita/disabilita gli arresti (pulsante rosso D)
- arresto in base al numero specificato di invocazioni del nodo

а. L'impostazione del numero iniziale m_brkuse nel nodo può essere effettuata con una macro (nel file di Trace)

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

b. Oppure direttamente nella finestra delle proprietà del nodo nel campo"DebugBreak after", che specifica il numero richiesto di chiamate prima dell'arresto.



4. Per scaricare il flusso di messaggi e velocizzare l'elaborazione, i seguenti messaggi sono disabilitati nell'indicatore TraceAgent:

CHARTEVENT_CLICK
CHARTEVENT_KEYDOWN
CHARTEVENT_OBJECT_DELETE
CHARTEVENT_OBJECT_CHANGE
CHARTEVENT_OBJECT_CREATE

5. Piccole modifiche estetiche alla mappatura dell'albero

File:
MQL5.zip  27 kb
 

Super articolo, grazie, sergeev!

C'è un modo per utilizzare questo meccanismo negli script?

 
denkir:

Esiste un modo per utilizzare questo meccanismo negli script?

Penso di sì. Ma di solito negli script il codice non viene ramificato molto (a meno che, ovviamente, lo script non sia in un ciclo).

Inoltre, c'è un inconveniente: l'evento OnChartEvent non viene gestito negli script.

 
sergeev:

Penso di sì. Ma di solito negli script il codice non viene ramificato molto (a meno che, ovviamente, lo script non sia in un ciclo).

Inoltre, c'è un inconveniente: gli script non gestiscono l'evento OnChartEvent.

E se il mio script utilizza molte classi diverse, le gerarchie di classi?

Penso che sia necessario affinare lo strumento anche per gli script...

 

La classe CTraceView non si preoccupa di chi la chiama: crea un albero e lo visualizza.

Ma gli script hanno un problema di feedback irrisolvibile. Non sarà possibile lavorare attivamente con l'albero.