"Kaynak Kodun İzlenmesi, Hata Ayıklanması ve Yapısal Analizi" makalesi için tartışma

 

Yeni makale Kaynak Kodun İzlenmesi, Hata Ayıklanması ve Yapısal Analizi yayınlandı:

Yürütülen bir kodun yapısını oluşturma ve izleme sorunlarının tamamı, ciddi zorluklar olmadan çözülebilir. Bu olasılık, MQL5 dilinin yeni özelliği - karmaşık veri türlerinin (yapılar ve sınıflar) otomatik olarak oluşturulması ve yerel kapsam dışına çıkarken bunların ortadan kaldırılması nedeniyle MetaTrader 5'te ortaya çıkmıştır. Makale, metodolojinin ve hazır aracın açıklamasını içerir.

Böyle bir kırılma noktasıyla karşılaşıldığında, yığın ağaçları bu makroyu çağıran işlevi görüntülemek için senkronize edilir. Bir düğüm kapalıysa, üst düğüm onu gösterecek şekilde genişletilir. Ve gerekirse, düğümü görünür alana getirmek için ağaç yukarı veya aşağı kaydırılır.


CTraceCtrl::Break'ten çıkmak için, düğüm adının yanında bulunan kırmızı düğmeye tıklayın.

Yazar: ---

 

Oh, evet, Puşkin, evet, orospu çocuğu.

Bu harika bir makale. Gerçek bir endoskop.

Büyük projelerde kesinlikle kullanacağım. Hatanın nerede olduğunu bulmam 24 saatimi alıyor.

Debugger iyi ama trace sinyal geçişinin tam bir resmini veriyor.

 
Evet, güzel makale. Teşekkürler, Alex.
 

Rica ederim, sizin için elimden geleni yaptım. :)

Bu sistemdeki işlevselliği sürdürmeyi ve genişletmeye çalışmayı planlıyorum. Bir şeye ihtiyaç olacaksa, o zaman yazın.

-----

Tam açıklık için tamamen teknik iki noktadan daha bahsetmek gerektiğini düşünüyorum.

1. Trace.mqh dosyasında izleyicinin tek bir örneği oluşturulur (dosyanın en altında).

extern CTraceCtrl* m_trace; // izleyicinin tek bir örneği

Extern yönergesi sayesinde, örnek sadece bir tane olacaktır. Yani, #include "Trace.mqh" dosyasına kaç tane #include "Trace.mqh" dosyası dahil edildiğine bağlı değildir


2.
CTraceView sınıfı CTraceCtrl 'de sadece tek bir nedenle kullanılır - CTraceCtrl::Break fonksiyonunu çalıştırmak için.
Yani, döngülü bir while (true) içinde kullanıcı tıklamalarına tepki vermek için

 

Tüm sınıfların güncellendiği __PATH__ makro işleme eklendi (yapı 420).

INFO penceresine bir düğüm dosyası açmak için düğme eklendi.



Açma işlemi ShellExecute komutu ile gerçekleştirilir, bu nedenle sınıfların çalışması için DLL içe aktarma izni gereklidir

Dosyalar:
MQL5.zip  23 kb
 

düğüm açıklaması eklemek için işlevsellik eklendi.

Artık _IN makrolarında, örneğin bir düğüme girme koşullarını veya ilgili bazı bilgileri görüntülemek için ek bir açıklama eklemek mümkündür.

Bu açıklama ağaç ekranında dinamik olarak güncellenir.

Kod örneği:

void OnTick()
  { _IN("");
   static datetime limit_time=0; // son işlem süresi + zaman aşımı
//--- zaman aşımına uğrarsa işleme koymayın
   if(TimeCurrent()>=limit_time)
     { _IN2(TimeCurrent()+">="+limit_time);
      //--- veri olup olmadığını kontrol edin
      if(Bars(Symbol(),Period())>2*InpMATrendPeriod)
        { _IN3(Bars(Symbol(),Period())>2*InpMATrendPeriod);
         //--- işlenirse limit süresini saniye cinsinden zaman aşımına göre değiştirin
         if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut;
        }
     }
//---
  }


Bilgilerin nasıl görüneceğine dair bir örnek


Açıklama ekranını etkinleştirmek için düğme - sağ üst "i"

Dosyalar:
MQL5.zip  23 kb
 

1. Düğüm özelliklerini görüntülemek için ayrı bir CPropertyView sınıfı eklendi.

2. Sınıfların tüm geçersiz kılınmış işlevleri sanal hale getirildi, böylece tüm sınıflar güncellendi.

3. CNode sınıfına iki yeni özellik eklendi.
m_edit - CPropertyView'de düzenlenebilir alanın işareti
m_brkuse - CTraceCtrl::Break fonksiyonunun durdurulduğu ve çağrıldığı düğüme yapılan çağrı sayısı.

3. Urain'in forumdaki notlarına göre, kod durdurmalarını kullanmak için iki olasılık eklendi.
- durdurmaları etkinleştir/devre dışı bırak (kırmızı düğme D)
- belirtilen düğüm çağırma sayısına göre durdurma

а. Düğümdeki ilk m_brkuse sayısının ayarlanması bir makro kullanılarak yapılabilir (Trace dosyasında)

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

b. Veya doğrudan düğüm özellikleri penceresinde, durdurmadan önce gerekli çağrı sayısını belirten"DebugBreak after" alanında



4. Mesaj akışını boşaltmak ve işlemeyi hızlandırmak için aşağıdaki mesajlar!TraceAgent göstergesinde devre dışı bırakılır:

CHARTEVENT_CLICK
CHARTEVENT_KEYDOWN
CHARTEVENT_OBJECT_DELETE
CHARTEVENT_OBJECT_CHANGE
CHARTEVENT_OBJECT_CREATE

5. Ağaç eşlemede küçük kozmetik değişiklikler

Dosyalar:
MQL5.zip  27 kb
 

Süper makale, teşekkürler, sergeev!

Bu mekanizmayı komut dosyalarında kullanmanın bir yolu var mı?

 
denkir:

Bu mekanizmayı komut dosyalarında kullanmanın bir yolu var mı?

Sanırım var. Ancak genellikle komut dosyalarında kod çok fazla dallanmaz (tabii ki komut dosyası bir döngü içinde değilse).

Ayrıca, bir rahatsızlık var - OnChartEvent olayı komut dosyalarında işlenmiyor.

 
sergeev:

Sanırım öyle. Ancak genellikle komut dosyalarında kod çok fazla dallanmaz (tabii ki komut dosyası bir döngü içinde değilse).

Ayrıca, bir rahatsızlık var - komut dosyaları OnChartEvent olayını işlemez.

Ve eğer betiğim birçok farklı sınıf kullanıyorsa, sınıf hiyerarşileri?

Bence betikler için de aracı keskinleştirmek gerekiyor...

 

CTraceView sınıfı kendisini kimin çağırdığını umursamaz. Bir ağaç oluşturur ve onu görüntüler.

Ancak komut dosyalarının çözülemeyen bir geri bildirim sorunu vardır. Ağaç ile aktif olarak çalışamazsınız.