기고글 토론 "소스 코드의 트레이싱, 디버깅, 및 구조 분석"

 

새로운 기고글 소스 코드의 트레이싱, 디버깅, 및 구조 분석 가 게재되었습니다:

실행된 코드의 구조 생성과 추적에 따른 전체 문제를 큰 어려움 없이 해결할 수 있습니다. MQL5 언어의 새로운 기능인 복잡한 유형의 데이터(구조 및 클래스)의 자동 생성과 로컬 범위를 벗어날 때 이러한 변수가 제거됨에 따라 MetaTrader 5에서 이러한 가능성이 대두되었습니다. 이 문서에서는 방법론에 대한 해석과 레디메이드 툴을 보여드리겠습니다.

이러한 중단점을 충족하면 스택 트리가 동기화되어 이 매크로라는 함수를 표시합니다. 노드가 닫히면 부모 노드가 확장되어 노드가 표시됩니다. 필요한 경우 트리를 위 또는 아래로 스크롤하여 노드를 가시 영역으로 가져옵니다.


CTraceCtrl::Break에서 이탈하려면 노드 이름 근처에 위치한 빨간 버튼을 누르면 됩니다.

작성자: ---

 

그래, 푸시킨, 그래, 개자식아.

좋은 기사였어요 진짜 내시경이네요.

대규모 프로젝트에 꼭 사용하겠습니다. 오류가 어디 있는지 알아내는 데 24시간이 걸리거든요.

디버거도 좋지만 트레이스는 신호 통과에 대한 완전한 그림을 제공합니다.

 
네, 좋은 기사입니다. 고마워요, Alex.
 

천만에요, 최선을 다했습니다. :)

나는이 시스템의 기능을 유지하고 확장하려고 노력할 계획입니다. 무언가가 필요하면 글을 쓰십시오.

-----

완전한 명확성을 위해 순전히 기술적 인 두 가지 사항에 대해 더 말할 필요가 있다고 생각합니다.

1. Trace.mqh 파일에서 추적기의 단일 인스턴스가 생성됩니다 (파일 하단에 있음).

extern CTraceCtrl* m_trace; // 트레이서의 단일 인스턴스

외부 지시어 덕분에 인스턴스는 하나만 생성됩니다. 즉, #include "Trace.mqh " 파일에 포함된 #include "Trace.mqh " 파일 수에 의존하지 않습니다.


2.
CTraceView 클래스는 오직 한 가지 이유, 즉 CTraceCtrl::Break 함수를 처리하기 위해서만 CTraceCtrl에서 사용됩니다.
즉, 반복되는 동안(참) 에 사용자 클릭에 대한 반응을 갖기 위해서입니다.

 

모든 클래스가 업데이트되는 __PATH__ 매크로 처리(빌드 420)가 추가되었습니다.

정보 창에 노드 파일 열기 버튼이 추가되었습니다.



열기는 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.
m_edit - CPropertyView에서 편집 가능한 필드의 표시
m_brkuse - CTraceCtrl::Break 함수가 중지되고 호출되는 노드 호출 횟수 3.

3.
- 중지 활성화 / 비활성화 (빨간색 버튼 D)
- 지정된 노드 호출 수에 따라 중지합니다.

а. 매크로(추적 파일에서)를 사용하여 노드에서 초기 번호 m_brkuse를 설정할 수 있습니다.

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

b. 또는 노드 속성 창의"DebugBreak after" 필드에서 직접 중지하기 전에 필요한 호출 횟수를 지정할 수 있습니다.



4. 메시지 흐름을 오프로드하고 처리 속도를 높이기 위해!TraceAgent 표시기에서 다음 메시지가 비활성화됩니다:

CHARTEvent_CLICK
CHARTEENT_KEYDOWN
CHARTEENT_OBJECT_DELETE
CHARTEENT_OBJECT_CHANGE
CHARTEENT_OBJECT_CREATE

5. 트리 매핑의 사소한 외관 변경

파일:
MQL5.zip  27 kb
 

훌륭한 글 감사합니다, sergeev!

이 메커니즘을 스크립트에서 사용할 수 있는 방법이 있나요?

 
denkir:

스크립트에서 이 메커니즘을 사용할 수 있는 방법이 있나요?

그런 것 같습니다. 하지만 일반적으로 스크립트에서는 코드가 많이 분기되지 않습니다(물론 스크립트가 루프에 있지 않는 한).

게다가 불편한 점이 하나 있습니다. OnChartEvent 이벤트는 스크립트에서 처리되지 않습니다.

 
sergeev:

그런 것 같아요. 그러나 일반적으로 스크립트에서는 코드가 많이 분기되지 않습니다(물론 스크립트가 루프에 있지 않는 한).

게다가 불편한 점이 하나 있는데, 스크립트에서 OnChartEvent 이벤트를 처리하지 않는다는 점입니다.

그리고 스크립트가 여러 가지 클래스를 사용하는 경우 클래스 계층 구조?

스크립트용 도구도 좀 더 날카롭게 다듬어야 할 것 같아요...

 

CTraceView 클래스는 누가 호출하든 상관하지 않습니다. 트리를 만들어서 표시합니다.

하지만 스크립트에는 해결할 수 없는 피드백 문제가 있습니다. 트리를 적극적으로 사용할 수 없습니다.