2012-10-14 9 views
6

Durante il debug in Delphi, un'eccezione mi dirà correttamente la riga di codice che causa l'errore, ma non posso accedere a nessuna variabile locale. Si tratta di una limitazione nel debugger? O mi sto perdendo qualcosa di semplice? Al momento, devo riflettere tutte le variabili locali su una linea globale prima dell'errore, ricompilare il programma e sperare di poter ripetere la stessa eccezione.Eccezioni Delphi che non mi permettono di vedere le variabili locali

Ad esempio

MyArray[I]:=Foo(...); 

Se I è fuori dai limiti (con controllo dei limiti accesi), non riesco a vedere ciò che la variabile I è, a meno che specchiai ad una variabile di debug scope globalmente sulla riga precedente .

O se ho

MyInteger:=Trunc(MyFloat), 

e MyFloat è 6.1E+17, non ho idea di che cosa il suo valore è.

+0

Questa è una limitazione nota del debugger. Non c'è molto che tu possa fare. –

+0

Sono nuovo qui (primo post). Non riesco a trovare "risposta a domande", eppure ho visto altri dire "ricorda di segnare la domanda risposta". Come lo faccio? –

+4

Come ricordo, quando ho riscontrato questa limitazione, Robert, ho impostato esplicitamente un punto di interruzione sulla linea che causa il problema (supponendo che il problema sia riproducibile) in modo da poter accedere alle variabili locali appena prima dell'eccezione. Oppure, ho circondato il codice locale con una prova ... tranne e ho messo una riga nel blocco tranne su cui potrei impostare un punto di interruzione. – RobertFrank

risposta

7

È possibile visualizzare i valori delle variabili locali quando si seleziona la riga corretta nella finestra dello stack di chiamate. Di solito è una o due righe prima che venga sollevata l'eccezione.

Non ho la versione esatta a portata di mano quando questo è stato implementato, ma è sicuramente una delle versioni più recenti.

+2

Posso confermare che D7 non può, ma D2007 può mostrare i valori nella finestra delle variabili locali (non nella finestra degli orologi) quando si fa doppio clic sulla riga appropriata nello stack delle chiamate. –

+0

Ho verificato che funzioni in XE3. Non so perché ci sono due stack per ogni procedura o funzione nella traccia dello stack, ma uno dei due dà risultati poco accurati, ma l'altro dà risultati corretti. Non ho ancora provato alcun vero debug (solo eccezioni deliberate), ma presumo il 99% delle volte, sarà ovvio quale è corretto. –

1

Il "problema" è causato dal compilatore per quanto ne so. La funzione di ottimizzazione del compilatore agisce come un garbage collector, libera le variabili dichiarate all'interno di una funzione quando non vengono più utilizzate.

Per risolvere il problema, scrivere un gestore di eccezioni e utilizzare la variabile all'interno del blocco di eccezioni.

Problemi correlati