Discusión sobre el artículo "Rastreo, Depuración y Análisis Estructural de Código Fuente"

 

Artículo publicado Rastreo, Depuración y Análisis Estructural de Código Fuente:

Todos los problemas que supone la creación de una estructura de código ejecutado y su rastreo se pueden solucionar sin grandes dificultades. Esta posibilidad ha aparecido en MetaTrader 5 a causa de la nueva prestación del lenguaje MQL5: creación automática de variables de tipo complejo de datos (estructuras y clases) y su eliminación al salir del alcance local. Este artículo contiene la descripción de la metodología y la herramienta ya preparada.

Autor: o_O

 

Oh, sí, Pushkin, sí, hijo de puta.

Es un gran artículo. Un verdadero endoscopio.

Definitivamente lo usaré en grandes proyectos. Me lleva 24 horas averiguar dónde está el error.

El depurador es bueno, pero la traza da una imagen completa del paso de la señal.

 
Sí, buen artículo. Gracias, Alex.
 

De nada, he hecho lo que he podido por ti. :)

Tengo la intención de mantener y tratar de ampliar la funcionalidad en este sistema. Si habrá una necesidad de algo, a continuación, escribir.

-----

Para mayor claridad creo que es necesario decir acerca de dos puntos más puramente técnicos.

1. En el archivo Trace.mqh se crea una única instancia del trazador (al final del archivo).

extern CTraceCtrl* m_trace; // una única instancia del trazador

Gracias a la directiva extern, la instancia será sólo una. Es decir, no depende de cuántos archivos #include "Trace.mqh " se incluyan en el archivo #include "Trace.mqh"


2.
La clase CTraceView se utiliza en CTraceCtrl sólo por una única razón - para hacer funcionar la función CTraceCtrl::Break.
Es decir, para tener una reacción a los clics del usuario en un bucle while (true)

 

Se ha añadido el procesamiento de macros __PATH__ (compilación 420), en relación con el cual se actualizan todas las clases.

Se ha añadido el botón para abrir un archivo de nodo en la ventana INFO.



La apertura se realiza mediante el comando ShellExecute , por lo que se requiere permiso de importación de DLL para que las clases funcionen

Archivos adjuntos:
MQL5.zip  23 kb
 

añadida la funcionalidad para añadir la descripción del nodo.

Ahora en las macros _IN es posible añadir una descripción adicional, por ejemplo, para mostrar las condiciones para entrar en un nodo o alguna información relevante.

Esta descripción se actualiza dinámicamente en la visualización del árbol.

Ejemplo de código:

void OnTick()
  { _IN("");
   static datetime limit_time=0; // tiempo de procesamiento de la última operación + tiempo de espera
//--- no procesar si timeout
   if(TimeCurrent()>=limit_time)
     { _IN2(TimeCurrent()+">="+limit_time);
      //--- comprobar datos
      if(Bars(Symbol(),Period())>2*InpMATrendPeriod)
        { _IN3(Bars(Symbol(),Period())>2*InpMATrendPeriod);
         //--- cambiar el tiempo límite por el tiempo de espera en segundos si se procesa
         if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
//---
  }


Un ejemplo de cómo se verá la información


Botón para activar la visualización de la descripción - arriba a la derecha "i"

Archivos adjuntos:
MQL5.zip  23 kb
 

1. Añadida una clase CPropertyView independiente para mostrar las propiedades de los nodos.

2. Todas las funciones anuladas de las clases se hacen como virtuales, por lo que todas las clases se actualizan.

3. 2. Añadidas dos nuevas propiedades a la clase CNode.
m_edit - signo del campo editable en CPropertyView
m_brkuse - número de llamadas al nodo, en las que la función CTraceCtrl::Break se detiene y es llamada. 3. Añadidas dos nuevas propiedades a la clase CNode.

3. De acuerdo con las notas de Urain en el foro, se añadieron dos posibilidades de uso de las paradas de código.
- activar/desactivar paradas (botón rojo D)
- parada por número especificado de invocación al nodo.

а. Establecer el número inicial m_brkuse en el nodo se puede hacer usando una macro (en el archivo Trace)

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

b. O directamente en la ventana de propiedades del nodo en el campo"DebugBreak después de", que especifica el número requerido de llamadas antes de parar



4. Para descargar el flujo de mensajes y acelerar el procesamiento, los siguientes mensajes están desactivados en el indicador!TraceAgent:

CHARTEVENT_CLICK
CHARTEVENT_KEYDOWN
CHARTEVENT_OBJECT_DELETE
CHARTEVENT_OBJECT_CHANGE
CHARTEVENT_OBJECT_CREATE

5. CAMBIOS COSMÉTICOS MENORES EN EL MAPEADO DEL ÁRBOL. Cambios cosméticos menores en la asignación de árboles

Archivos adjuntos:
MQL5.zip  27 kb
 

¡Super artículo, gracias, sergeev!

¿Hay alguna manera de utilizar este mecanismo en los scripts?

 
denkir:

¿Hay alguna forma de utilizar este mecanismo en los scripts?

Yo creo que sí. Pero normalmente en los scripts el código no se ramifica mucho (a menos, por supuesto, que el script esté en un bucle).

Además, hay un inconveniente - el evento OnChartEvent no se maneja en los scripts.

 
sergeev:

Yo creo que sí. Pero normalmente en los scripts el código no se ramifica mucho (a no ser, por supuesto, que el script esté en un bucle).

Además, hay un inconveniente - los scripts no manejan el evento OnChartEvent.

¿Y si mi script utiliza muchas clases diferentes, jerarquías de clases?

Creo que es necesario afinar la herramienta para scripts también...

 

A la clase CTraceView no le importa quién la llame. Hará un árbol y lo mostrará.

Pero los scripts tienen un problema de retroalimentación irresoluble. No podrás trabajar activamente con el árbol.