【问题标题】:How to create a 'local variables' display using DWScript and its debugger如何使用 DWScript 及其调试器创建“局部变量”显示
【发布时间】:2011-09-09 08:44:31
【问题描述】:

我正在为DWScript 编写一个IDE,并使用调试器让它逐步执行代码。我现在希望添加“局部变量”的显示(即范围内的变量)。有人可以给我一个指向这样做的方法吗?我可以获得所有符号的列表,但不明白如何获取事物的当前范围部分。 谢谢。

【问题讨论】:

    标签: delphi debugging variables ide dwscript


    【解决方案1】:

    IdwsProgramExecution 转换为 TdwsProgramExecution,您将获得对“CurrentProg”属性、TdwsProgram的访问权限em> 是 TdwsMainProgram (如果你在 main 中)或 TdwsProcedure (如果你在 proc/func/method 中)。那些将有一个 Table 属性,它列出了本地符号,这是最直接的范围。 该 Table 将有一个或多个 Parents,它们引用父范围(在源代码范围方面是分层的)。

    如果在 TdwsProcedure 中,您可能还想查看它的 FuncSymbol 属性,该属性将有一个参数表(如果您想直接隔离参数,这很有用从本地范围的其余部分)

    【讨论】:

      【解决方案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;
      

      【讨论】:

      • 您可以使用 TdwsCompiler.Evaluate 来评估变量或使用局部变量的表达式(调试器的观察者使用它)。直接堆栈访问是最有效的方式,如果您只想要变量的值,但 Evaluate 允许更轻松地获取类变量的 ClassName f.i.
      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 2016-09-05
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多