如何使用DWScript及其调试器创建“局部变量”显示

时间:2011-09-09 08:44:32

标签: delphi debugging variables ide dwscript

我正在为DWScript编写一个IDE,并使用调试器逐步完成代码。我现在希望添加一个'局部变量'的显示(即范围内的变量)。有人能指点我这样做的方法吗?我可以获得所有符号的列表,但不了解如何获得当前范围的一部分。 感谢。

2 个答案:

答案 0 :(得分:9)

IdwsProgramExecution 投射到 TdwsProgramExecution ,您将获得对“ CurrentProg ”属性的访问权限 TdwsProgram TdwsMainProgram (如果你在主要的话)或 TdwsProcedure (如果你在proc / func /方法中)。那些将具有 Table 属性,该属性列出了本地符号,这是最直接的范围。 Table 将包含一个或多个 Parents ,它引用父作用域(按层次结构,就源代码范围而言)。

如果在 TdwsProcedure 中,您可能还想查看其 FuncSymbol 属性,该属性将包含一个参数表(如果您想直接隔离参数,则非常有用)来自本地其他地方)

答案 1 :(得分: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;