2011-09-09 20 views
6

DWScript için bir IDE yazıyorum ve hata ayıklayıcısını kullanarak kodun içine adım atıyorum. Şimdi 'yerel değişkenler' (yani kapsamdakiler) görüntüsünü eklemek istiyorum. Birisi bana bunu yapma araçlarına işaret edebilir mi? Tüm sembollerin bir listesini alabilirim, ancak şu anki kapsam kısmının nasıl ele alınacağını anlamıyorum. Teşekkürler.DWScript ve hata ayıklayıcısını kullanarak bir 'yerel değişkenler' görünümü nasıl oluşturulur

cevap

9

Cast IdwsProgramExecution TdwsProgramExecutioniçin, sen özelliği bir "CurrentProg" erişebileceksiniz, (ana iseniz) bir TdwsMainProgram ya bir TdwsProgram veya Bir TdwsProsedürü (eğer bir proc/func/yöntemindeyseniz). Bu yerel simgeler listeler, en doğrudan kapsamı olan bir Tablo özelliğine sahip olacak.Bu Tablo, üst kapsamları (hiyerarşik olarak, kaynak kodu kapsamı açısından) gösteren bir veya daha fazla Ebeveynleri olacaktır.

bir TdwsProcedure yılında, aynı zamanda (doğrudan yerel kapsam geri kalanından parametrelerini izole etmek istediğinizde yararlı) parametrelerinin bir tablo var edecek olan kendi FuncSymbol tesiste bakmak isteyebilirsiniz Eğer

+0

Teşekkürler Eric, ilk kez çalıştı. –

2

Bu soruyu okuyan diğerleri için, bir sembolün değerini almakla ilgili bazı ek bilgileri göstereceğim. Sembol, yukarıda Eric tarafından tarif edildiği gibi bulunur, ancak sembolün gerçek değerini nasıl elde edeceğinizi öğrenmek zordur. Aşağıdaki kod, her çağrıldığında bir TMemo (memLocalVariables) yerel değişkenlerle dolduran bir yordamdır. Değişken değerin düzgün biçimlendirilmesi ve arama parametrelerine erişim gibi bazı özellikler eksik. Bunu hata ayıklayıcısından 'dsDebugSuspended' durumundan arıyorum. Daha az sezgisel bit, yığın üzerindeki sembol verilerine ve yığın taban işaretçisinin kullanımına erişimdir. Derleyicinin nasıl çalıştığını öğrenmek için harika bir yol! Ama, belki de bulamadığım bir yerde bir yardımcı fonksiyon var mı? Eric

procedure DrawLocalVariables; 
    var 
    ProgramExecution : TdwsProgramExecution; 
    I : integer; 
    Sym : TSymbol; 
    V : variant; 
    Adr : integer; 
    SymbolTable : TSymbolTable; 
    begin 
    memLocalVariables.Lines.Clear; 

    ProgramExecution := TdwsProgramExecution(dwsDebugger1.Execution); 
    SymbolTable := ProgramExecution.CurrentProg.Table; 
    For I := 0 to SymbolTable.Count-1 do 
     begin 
     Sym := SymbolTable[I]; 
     if Sym is TDataSymbol then 
     begin 
     Adr := TDataSymbol(Sym).StackAddr + ProgramExecution.Stack.BasePointer; 
     ProgramExecution.Stack.ReadValue(Adr, V); 
     memLocalVariables.Lines.Add(Format('%s = %s', [ Sym.Name, VarToStr(V) ])); 
     end; 
     end; 
    end; 
+1

TdwsCompiler.Evaluate değişkenini veya yerel değişkenleri kullanarak bir ifadeyi değerlendirmek için kullanabilirsiniz (hata ayıklayıcının gözlemcisi bunu kullanır). Doğrudan yığın erişimi en etkili yoldur, ancak eğer sadece değişkenin değerini istiyorsanız, ancak Değerlendirmek bir sınıf değişkeninin ClassName'ini daha kolay bir şekilde almasına izin verir. –

+0

İyi nokta Eric, teşekkürler, bunu düşünmezdim –

İlgili konular