我正在为DWScript编写一个 IDE,并让它使用调试器逐步执行代码。我现在希望添加“局部变量”(即范围内的变量)的显示。有人可以给我一个指向这样做的方法吗?我可以获得所有符号的列表,但不明白如何获取事物的当前范围部分。谢谢。
2 回答
将IdwsProgramExecution 转换为TdwsProgramExecution,您将获得对“ CurrentProg ”属性、TdwsProgram的访问权限,它是TdwsMainProgram(如果您在 main 中)或TdwsProcedure(如果您在 proc/func/method 中)。那些将有一个Table属性,它列出了本地符号,这是最直接的范围。该表将有一个或多个Parent,它引用父范围(在源代码范围方面是分层的)。
如果在TdwsProcedure中,您可能还想查看它的FuncSymbol属性,该属性将有一个参数表(如果您想直接将参数与本地范围的其余部分隔离,这很有用)
对于阅读此问题的任何其他人,我将展示一些与获取符号值有关的补充信息。如上面 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;