記事"ソースコードのトレーシング デバッギング 構造分析"についてのディスカッション

 

新しい記事 ソースコードのトレーシング デバッギング 構造分析 はパブリッシュされました:

実行されたコードのストラクチャーの作成とトレーシングの複雑な問題は、特に困難なく解決することができます。これは、MetaTrader5から可能になりました。これは、MQL5言語の新しい機能である、様々な複雑なデータ型の自動生成やローカルスコープ外に出た際の除去などのおかでです。この記事は、その方法論や、すぐ使えるツールを紹介します。

作者: o_O

 

ああ、そうだ、プーシキン、そうだ、この野郎。

素晴らしい記事だ。本物の内視鏡だ。

大きなプロジェクトでは必ず使うよ。エラーの場所を特定するのに24時間かかるんだ。

デバッガーもいいけど、トレースは信号通過の全体像を教えてくれる。

 
ああ、いい記事だ。ありがとう、アレックス。
 

どういたしまして、あなたのためにベストを尽くしました。:)

もし何か必要なものがあれば、書いてください。

-----

完全に明確にするために、さらに2つの純粋に技術的な点について言う必要があると思います。

1. 1.Trace.mqhファイルでは、トレーサーのインスタンスが1つ作成されます(ファイルの一番下にあります)。

extern CTraceCtrl* m_trace; // トレーサーの単一のインスタンス

extern ディレクティブのおかげで、インスタンスは1つだけになります。つまり、#include "Trace.mqh " ファイルにいくつ#include "Trace.mqh " が含まれているかには依存しません。


2.
CTraceView クラスがCTraceCtrlで 使用される理由はただ一つ、CTraceCtrl::Break 関数を実行するためである。
すなわち、ループされたwhile (true)の 中で、ユーザがクリックしたときのリアクションを持つためである。

 

PATH__ マクロ処理を追加した(ビルド420)。

INFOウィンドウにノードファイルを開くボタンを追加しました。



オープンはShellExecute コマンドで行うため、DLLのインポート許可が 必要。

ファイル:
MQL5.zip  23 kb
 

ノードの説明を追加する機能を追加しました。

例えば、ノードに入るための条件や関連情報を表示することができます。

この説明はツリー表示で動的に更新されます。

コード例

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.
m_edit -CPropertyViewの 編集可能フィールドの符号
m_brkuse -CTraceCtrl::Break 関数が停止して呼び出されるノードへの呼び出し回数 3.

3. フォーラム 上のUrainの メモによると、コードストップの使用方法として2つの可能性が追加された。
- ストップの有効/無効(赤いボタン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
 

ありがとう、セルゲイエフ

このメカニズムをスクリプトで使う方法はありますか?

 
denkir:

このメカニズムをスクリプトで使う方法はあるのだろうか?

あると思う。しかし、通常スクリプトではコードはあまり分岐されません(もちろんスクリプトがループしている場合は別ですが)。

それに、スクリプトではOnChartEvent イベントが処理されないという不都合もある。

 
sergeev:

そうだと思う。しかし、通常スクリプトではコードはあまり分岐しません(もちろんスクリプトがループしている場合は別ですが)。

それに、スクリプトはOnChartEventイベントを扱わないという不都合もある。

そして、もし私のスクリプトが多くの異なるクラス、クラス階層を使用するのであれば?

スクリプトのためのツールも磨く必要があると思うのだが...。

 

CTraceViewクラスは誰が呼ぼうと気にせず、ツリーを作って表示する。

しかし、スクリプトには解決不可能なフィードバックの問題がある。積極的にツリーを操作することはできない。