Задача Трассировки

 

Допустим имеем некий код (функции, классы и т.д.)

Есть интересная задача - создать стек вызовов средствами MQL  Но не просто линейный, а в виде дерева.

Где узлом дерева будет вход в функцию, а ветками - вызовы следующих функций из текущей функции узла.

Например есть такая структура функций

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

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

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

в результате это будет выглядеть примерно так


Обязательное условие:

В функции имеющегося кода можно добавлять всего лишь одну функцию для организации трейсинга (то есть например только в начале или перед return).
Это условие необходимо для того, что не делать большую модификацию кода, а ограничится лишь вставкой одной и той же функции трейсинга (например назовем её _TRACE_IN_) - во все имеющиеся функции кода.


Буду рад услышать любые идеи или варианты.
Как ни кручу - натыкаюсь на замкнутый круг, что надо вызывать не одну, а две функции для формирования такого дерева. А надо по-любому только одна. :)

 

Если надо не одна а две, выход очевиден -- вместо функции используем экземпляр класса.

Правда пока непонятно, как это сделать при отсутствии нормальных конструкторов, но мысль потихоньку формируется... Возможно скоро отвечу поконкретнее.

 
TheXpert:

Если надо не одна а две, выход очевиден -- вместо функции используем экземпляр класса.

Правда пока непонятно, как это сделать при отсутствии нормальных конструкторов, но мысль потихоньку формируется... Возможно скоро отвечу поконкретнее.

ок. спасибо.

нужна одна - потому как делать модификацию например всей стандартной либы МТ5 нереально. ( если и напрячься, то только порасставлять в начало всех функций одно и тоже).

 
TheXpert:

Если надо не одна а две, выход очевиден -- вместо функции используем экземпляр класса.

Правда пока непонятно, как это сделать при отсутствии нормальных конструкторов, но мысль потихоньку формируется... Возможно скоро отвечу поконкретнее.

А кто мешает сделать так?

class CTraceIn
  {
public:
   void Trace(const string func);   // тут мы добавляем в глобальный объект ноду о вызове и делаем его топовым
   ~CTraceIn();                     // тут мы закрываем ноду о вызове, и топовой становиться предыдущая нода
  };

#define _TRACE_IN_ CTraceIn __X__; __X__.Trace(__FUNCTION__);

 
mql5:
А кто мешает сделать так?
Да, наверное ничего. Чей-то я зациклился на записи одной инструкцией.
 
mql5:
А кто мешает сделать так?

то есть грубо говоря - деструктор для экземпляра созданного класса будет вызван при выходе из функции?

во! вот это уже вещь. ДЕСТРУКТОРЫ это СИЛА! :)))

Спасибо!

 
mql5:
А кто мешает сделать так?

Хитрый!

:)

 
Получилось!
Файлы:
t.mq5  1 kb
Причина обращения: