文章 "源代码的跟踪、调试和结构分析"

 

新文章 源代码的跟踪、调试和结构分析已发布:

可以在没有很大困难的情况下解决创建执行代码的结构以及对其进行跟踪的整个复杂问题。由于 MQL5 语言的新功能 - 自动创建复杂类型的数据变量(结构和类)以及在超出局部范围时自动消失,这种可能性已经出现在 MetaTrader 5 中。本文提供对方法和现成工具的描述。

作者:o_O

 

哦,是的,普希金,是的,狗娘养的。

这篇文章很棒真正的内窥镜。

我一定会在大型项目中使用它。我花了 24 小时才找出错误所在。

调试器很好,但跟踪器能提供信号通过的全貌。

 
是啊,好文章。谢谢,亚历克斯。
 

不客气,我已经尽力了。:)

我计划维护并尝试扩展该系统的功能。 如果有需要,请写信给我。

-----

为了使问题更加清晰,我认为有必要再谈谈两个纯粹的技术问题。

1. 在 Trace.mqh 文件中创建了一个跟踪器实例(在文件底部)。

extern CTraceCtrl* m_trace; // 追踪器的单个实例

由于使用了extern 指令,该实例将只有一个。也就是说,这并不取决于#include "Trace.mqh" 文件中包含了多少个#include "Trace.mqh" 文件。


2.
CTraceCtrl 中使用CTraceView 类只有一个原因,那就是为了实现CTraceCtrl::Break 函数。
即在循环while (true) 时 对用户点击作出反应。

 

添加了__PATH__ 宏处理(构建 420),所有类都会随之更新。

在 INFO 窗口中添加了打开节点文件的按钮。



打开由ShellExecute 命令执行,因此类的运行需要DLL 导入权限

附加的文件:
MQL5.zip  23 kb
 

增加了添加节点说明的功能。

现在,在 _IN 宏中可以添加附加说明,例如,显示进入节点的条件或一些相关信息。

该说明将在树形显示中动态更新。

代码示例:

void OnTick()
  { _IN("");
   static datetime limit_time=0; // 上次交易处理时间 + 超时
//--- 如果超时则不处理
   if(TimeCurrent()>=limit_time)
     { _IN2(TimeCurrent()+">="+limit_time);
      //--- 检查数据
      if(Bars(Symbol(),Period())>2*InpMATrendPeriod)
        { _IN3(Bars(Symbol(),Period())>2*InpMATrendPeriod);
         //--- 如果已处理,按超时时间(秒)更改限制时间
         if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
//---
  }


信息外观示例


激活描述显示的按钮 - 右上方的"i"。

附加的文件:
MQL5.zip  23 kb
 

1.添加了一个单独的CPropertyView 类,用于显示节点属性。

2.将所有类的重载函数设为虚拟 函数,从而更新了所有类。

3.3. 为CNode 类添加了两个新属性。
m_edit -CPropertyView 中可编辑字段的符号
m_brkuse - 节点的调用次数,调用次数达到时将停止并调用CTraceCtrl::Break 函数。

3.根据Urain 论坛 上的说明 增加了两种使用代码停止的可能性。
- 启用/禁用停止(红色按钮D
- 按指定的节点调用次数停止

а.可以使用宏(在跟踪文件中)设置节点中的初始编号m_brkuse

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

b.或直接 在节点属性窗口的"DebugBreak after"(调试中断后)字段中,指定停止前所需的调用次数



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 事件。

如果我的脚本使用了许多不同的类,类的层次结构如何?

我认为也有必要改进脚本工具......

 

CTraceView 类并不关心是谁调用了它,它会生成一棵树并显示出来。

但脚本有一个无法解决的反馈问题。你将无法主动处理树。