Sto scrivendo un IDE per DWScript e ho ottenuto il passaggio attraverso il codice utilizzando il debugger. Ora desidero aggiungere una visualizzazione di "variabili locali" (cioè quelle in ambito). Qualcuno può darmi un suggerimento sui mezzi per farlo? Posso ottenere una lista di tutti i simboli ma non capisco come ottenere l'attuale ambito di applicazione. Grazie.Come creare una visualizzazione di 'variabili locali' utilizzando DWScript e il suo debugger
risposta
Fusioni il IdwsProgramExecution-TdwsProgramExecution, potrai accedere ad una "CurrentProg", proprietà, un TdwsProgram ovvero un TdwsMainProgram (se siete nella principale) o a TdwsProcedure (se si utilizza un metodo proc/func /). Quelli avranno una proprietà Table, che elenca i simboli locali, quello è l'ambito più diretto. Che La tabella avrà uno o più genitori, che fa riferimento agli ambiti parent (gerarchicamente, in termini di ambito del codice sorgente).
Se in un TdwsProcedure, si può anche voler guardare la sua proprietà FuncSymbol, che avrà una tabella di parametri (utile se si desidera isolare direttamente i parametri dal resto del campo di applicazione locale)
Per gli altri che stanno leggendo questa domanda, mostrerò alcune informazioni supplementari relative all'ottenimento del valore di un simbolo. Il simbolo è trovato come descritto sopra da Eric, ma è difficile capire come ottenere il valore reale del simbolo. Il codice seguente è una procedura che popola un TMemo (memLocalVariables) con variabili locali ogni volta che viene chiamato. Ci sono alcune funzionalità mancanti come la formattazione ordinata del valore della variabile e l'accesso ai parametri di chiamata. Lo chiamo dallo stato del debugger 'dsDebugSuspended'. Il bit meno intuitivo è l'accesso ai dati dei simboli sullo stack e l'uso del puntatore di base dello stack. Un ottimo modo per imparare come funziona il compilatore! Ma forse c'è una funzione di utilità da qualche parte che non ho trovato ...? Eric?
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;
È possibile utilizzare TdwsCompiler.Evaluate per valutare la variabile o un'espressione utilizzando le variabili locali (il watcher del debugger la usa). L'accesso diretto allo stack è tuttavia il modo più efficiente, se si desidera solo il valore della variabile, ma Evaluate consente di ottenere più facilmente ClassName di una variabile di classe f.i. –
Buon punto Eric, grazie, non ci avevo pensato –
- 1. Il debugger di Android Studio non mostra le variabili locali
- 2. setjmp/longjmp e variabili locali
- 3. SQL CASE e variabili locali
- 4. Come posso estrarre variabili locali da una traccia di stack?
- 5. Come definire variabili locali statiche locali del thread?
- 6. Multithreading, lambda e variabili locali
- 7. Debugger mostra npos = 4294967295 durante la visualizzazione delle variabili stringa
- 8. Visualizzazione simultanea di console e debugger in IntelliJ
- 9. Come ottenere variabili locali da una cornice stack sulla JVM
- 10. sicurezza Discussione e le variabili locali
- 11. codice rientrante e le variabili locali
- 12. Javadoc per variabili locali?
- 13. Valori predefiniti di variabili di istanza e variabili locali
- 14. Bytecode JVM, come posso trovare il tipo di variabili locali?
- 15. PowerShell Variabili globali variabili locali
- 16. Rails - Variabili locali contro variabili di istanza
- 17. Variabili di istanza Java vs variabili locali
- 18. Variabili locali MySQL
- 19. Le variabili globali e locali in R
- 20. Variabili locali all'interno di aes
- 21. Variabili della classe interna e locali
- 22. C++ variabili locali e thread (non thread_local)
- 23. Blocchi, loops e le variabili locali
- 24. Impossibile vedere alcune variabili locali nel debugger all'interno di intellij per alcuni programmi scala
- 25. Variabili locali passate (C++)
- 26. Come migliorare la visualizzazione delle variabili che sono oggetti nel debugger xcode 4.5 (noob)
- 27. ritorno riferimenti a variabili locali
- 28. variabili Constructor-locali a Scala
- 29. variabili locali: Programmazione Pratiche
- 30. accesso tutte le variabili locali
Grazie Eric, ha lavorato la prima volta. –