6

私はDWScript用の IDE を作成しており、デバッガーを使用してコードをステップ実行しています。ここで、「ローカル変数」(スコープ内の変数) の表示を追加したいと考えています。誰かがこれを行う手段へのポインタを教えてもらえますか? すべてのシンボルのリストを取得できますが、現在のスコープ部分を取得する方法がわかりません。ありがとう。

4

2 に答える 2

9

IdwsProgramExecutionTdwsProgramExecutionにキャストすると、「CurrentProg」プロパティ、TdwsMainProgram (メインの場合) またはTdwsProcedure (proc/func/method の場合) のいずれかであるTdwsProgramにアクセスできるようになります。 )。これらには、最も直接的なスコープであるローカル シンボルを一覧表示するTableプロパティがあります。そのTableには、親スコープを参照する1 つ以上のParentsがあります (階層的に、ソース コード スコープに関して)。

TdwsProcedureの場合、パラメーターのテーブルを持つFuncSymbolプロパティを確認することもできます (ローカル スコープの残りの部分からパラメーターを直接分離する場合に役立ちます)。

于 2011-09-09T10:30:15.467 に答える
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;
于 2011-09-09T15:53:52.003 に答える