2011-09-09 31 views

回答

9

演員的IdwsProgramExecutionTdwsProgramExecution,你會獲得一個 「CurrentProg」,性質,TdwsProgram既不是一個TdwsMainProgram(如果你在主要是)或一個TdwsProcedure(如果你在一個proc/func /方法)。那些將有屬性,它列出了本地符號,這是最直接的範圍。 那將有一個或多個父母,它涉及父範圍(分層,就源代碼範圍而言)。

如果在TdwsProcedure,你可能也想看看它FuncSymbol財產,這將有一個參數表(有用的,如果你想直接從局部範圍的其餘部分隔離參數)

+0

謝謝Eric,第一次工作。 –

2

對於任何其他人閱讀這個問題,我會顯示一些關於獲得符號價值的補充信息。這個符號是按Eric的描述找到的,但是很難弄清楚如何獲得符號的實際值。下面的代碼是一個過程,每次調用時都會使用局部變量填充TMemo(memLocalVariables)。有一些功能缺失,如變量值的整齊格式化和訪問調用參數。我從調試器'dsDebugSuspended'狀態調用它。不太直觀的一點是訪問堆棧上的符號數據以及使用堆棧基址指針。學習編譯器如何工作的好方法!但是,也許有一個實用功能,我沒有找到... ...?埃裏克?

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來使用局部變量(調試器的觀察者使用該變量)評估變量或表達式。不過,直接堆棧訪問是最有效的方法,如果您只需要變量的值,但Evaluate允許更容易地獲取類變量的ClassName f.i. –

+0

好點Eric,謝謝,我沒有想到這一點 –