Обсуждение статьи "Трассировка, отладка и структурный анализ кода"

 

Опубликована статья Трассировка, отладка и структурный анализ кода:

Весь комплекс задач создания структуры работающего кода и его трассировки можно решить без особых сложностей. Эта возможность появилась в MetaTrader 5 благодаря новому свойству языка MQL5 - автоматическое создание переменных сложного типа данных (структуры и классы) и их уничтожение при выходе из локальной области видимости. В статье описана методика и предоставлен готовый инструмент.

Автор: Alex Sergeev

 

Ай да Пушкин, ай да сукин сын.

Суперовая статейка. Настоящий эндоскоп.

Обязательно буду пользовать в больших проэктах. А то сутками паришься где ошибка.

Дебагер хорошо, но трассировка даёт полное представление о прохождении сигнала.

 
Да, хорошая статья. Спасибо, Алекс.
 

Пожалуйста, старался для вас. :)

Планирую сопровождать и постараться расширить функционал в этой системе.  Если будет необходимость в чем то, то пишите.

-----

Для полной ясности думаю надо сказать еще про такие два чисто технических момента.

1. В файле Trace.mqh создается единственный экземпляр трассировщика (внизу файла).

extern CTraceCtrl* m_trace; // единственный экземпляр трассировщика

благодаря директиве extern экземпляр будет только один. То есть не зависит сколько в подключаемых файлах #include "Trace.mqh"


2.
Класс CTraceView используется в CTraceCtrl только по одной единственной причине - отработка функции CTraceCtrl::Break.
А именно для наличия реакции на пользовательские клики в зацикленном while (true)

 

Добавлена обработка макроса __PATH__ (билд 420),  в связи с чем обновлены все классы.

В INFO окно вынесена кнопка открытия файла узла.



Открытие выполняется командой ShellExecute, поэтому для работы классов необходимо разрешение импорта DLL

Файлы:
MQL5.zip  23 kb
 

добавлен функционал для добавления описания узла.

теперь в макросах _IN есть возможность добавлять дополнительное описание, например для вывода условий входа в узел или некоторой актуальной информации.

Это описание динамично обновляется в отображении дерева.

Пример кода:

void OnTick()
  { _IN("");
   static datetime limit_time=0; // last trade processing time + timeout
//--- don't process if timeout
   if(TimeCurrent()>=limit_time)
     { _IN2(TimeCurrent()+">="+limit_time);
      //--- check for data
      if(Bars(Symbol(),Period())>2*InpMATrendPeriod)
        { _IN3(Bars(Symbol(),Period())>2*InpMATrendPeriod);
         //--- change limit time by timeout in seconds if processed
         if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
//---
  }


Пример как будет выглядеть информация


Кнопка активации показа описания - сверху справа "i"

Файлы:
MQL5.zip  23 kb
 

1. Добавлен отдельный класс CPropertyView для отоборажения свойств узла. 

2. Все переопределяемые функции у классов сделаны как virtual, в связи с чем обновлены все классы.

3. Добавлены два новых свойства в класс CNode
m_edit - признак редактируемого поля в CPropertyView
m_brkuse - число обращения к узлу, при котором происходит остановка и вызов функции CTraceCtrl::Break

3. По заметкам Urain на форуме добавлены две возможности использования остановки кода.
   - включение/отключение остановок (красная кнопка D)
   - остановка по указанному числу вызова узла

а. Задание начального числа m_brkuse в узле может производится с помощью макроса (в файле Trace)

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

b. Или непосредственно в окне свойств узла в поле "DebugBreak после", в котором указывается требуемое число вызовов до остановки



4. Для разгрузки потока сообщений и ускорения обработки в индикаторе !TraceAgent отключена отправка следующих сообщений :

    CHARTEVENT_CLICK
    CHARTEVENT_KEYDOWN
    CHARTEVENT_OBJECT_DELETE
    CHARTEVENT_OBJECT_CHANGE
    CHARTEVENT_OBJECT_CREATE

5. Мелкие косметические правки в отображении деревьев


Файлы:
MQL5.zip  27 kb
 

Супер статья, спасибо, sergeev!

А можно как-нибудь этот механизм использовать в скриптах?

 
denkir:

А можно как-нибудь этот механизм использовать в скриптах?

думаю да. Но обычно в скриптах код не разветвлен сильно (если конечно скрипт не в цикле).

К тому же есть неудобство - в скриптах не обрабатывается событие OnChartEvent.

 
sergeev:

думаю да. Но обычно в скриптах код не разветвлен сильно (если конечно скрипт не в цикле).

К тому же есть неудобство - в скриптах не обрабатывается событие OnChartEvent.

А если мой скрипт использует много разных классов, иерархий классов?

Думаю, что нужно заточить инструмент и под скрипты...

 

классу СTraceView все равно кто его вызывает.  Дерево он сделает и отобразит.

Но у скриптов нерешаемая проблема в обратной связи. Активно работать с деревом не получится.