私はDWScript用の IDE を作成しており、デバッガーを使用してコードをステップ実行しています。ここで、「ローカル変数」(スコープ内の変数) の表示を追加したいと考えています。誰かがこれを行う手段へのポインタを教えてもらえますか? すべてのシンボルのリストを取得できますが、現在のスコープ部分を取得する方法がわかりません。ありがとう。
2 に答える
IdwsProgramExecutionをTdwsProgramExecutionにキャストすると、「CurrentProg」プロパティ、TdwsMainProgram (メインの場合) またはTdwsProcedure (proc/func/method の場合) のいずれかであるTdwsProgramにアクセスできるようになります。 )。これらには、最も直接的なスコープであるローカル シンボルを一覧表示するTableプロパティがあります。そのTableには、親スコープを参照する1 つ以上のParentsがあります (階層的に、ソース コード スコープに関して)。
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;