2009-07-28 6 views
10

In Delphi 2009, il mio programma ora produce un errore "List index out of bounds". Esso genera una finestra di popup:Come trovare l'ubicazione di un errore "List out out of bounds" in Delphi

alt text http://www.beholdgenealogy.com/img/boundserror.gif

sto usando il "debug" Build configurazione che è checking acceso tutto l'errore di runtime. Ma questo non cattura l'errore prima che accada.

C'è un modo semplice per individuare la fonte di questo errore nel mio programma senza dover inserire i punti di interruzione e restringerlo per tentativi ed errori?

+1

Un altro uno per Stack Overflow, per fornire un forum e agli altri esperti che mi ha aiutato a ottenere rapidamente passato un problema che non avrei potuto facilmente trovato la soluzione per il mio proprio. – lkessler

+1

concordato. Semplicemente non capisco perché il mio voto positivo porti a zero questa domanda. Schermata affermata e piacevole, e ha suscitato buone risposte. Io proprio non capisco. – Argalatyr

+3

Immagino che se volessi aumentare le percentuali, avrei dovuto chiedere qualcosa del tipo: "Qual è il tuo cartone animato Delphi preferito". Fortunatamente, tutto ciò che volevo era una soluzione al mio problema. – lkessler

risposta

10

Hai "Stop su Delphi Exceptions" attivato? (Tools \ Debugger Options \ Language Exceptions [Delphi7]) Altrimenti non si romperà nel codice sorgente.

Assicurarsi inoltre che EListError non sia nell'elenco "Tipi di eccezione da ignorare". Questo elenco si trova anche in Tools \ Debugger Options \ Language Exceptions (Delphi 7).

+0

Questa è un'altra (arrivata dopo la versione di Alexander) della semplice risposta che stavo cercando. Lo controllerò quando torno a casa oggi. – lkessler

+1

Secondo SO, ho risposto un'ora prima;) e non ho visto la risposta di Alexanders quando ho postato il mio. Quindi, io ero il primo: P –

+0

Interessante. Deve essere una cosa del fuso orario che SO si sbaglia. Dice che hai risposto 14 ore fa e Alexander ha risposto 13 ore fa. Ma quando ordino per primo il più vecchio, il tuo viene avanti, quindi devi essere stato il primo. – lkessler

0

Qualche suggerimento su cosa sta facendo la tua applicazione quando questo si verifica? Un lungo loop? Un clic del tasto?

Quando l'applicazione si interrompe e si osserva la finestra di debug dello stack delle chiamate, è possibile rintracciare la chiamata all'ultima chiamata dal codice? Lo stack di chiamate non ti dice tutte le condizioni, ma può restringere la posizione.

Dopo aver ristretto la chiamata, uno strumento di registrazione come CodeSite può essere davvero utile. Ad esempio, registro spesso variabili di controllo del ciclo per capire quale iterazione si verifica l'ultima volta prima dell'errore, quindi si tratta di identificare i probabili sospetti.

+0

So che si tratta di un errore non consentito in uno dei molti TList utilizzati dal mio programma o da un componente del mio programma. Sono sorpreso che il controllo dei limiti non lo capisca. L'applicazione non si ferma. Continua dopo aver premuto il pulsante OK, ma con alcune funzionalità mancanti. Se riuscissi a trovare la chiamata, saprò dove si trova l'errore. Ma è difficile trovare la chiamata. – lkessler

+1

Il controllo dei limiti non lo rileva perché il controllo dei limiti si applica alle operazioni aritmetiche (overflow). Intendi il controllo dell'intervallo, ma il controllo dell'intervallo * non può * catturarlo perché ciò vale solo per gli array, non per le classi. Il messaggio di errore visualizzato è il risultato del "controllo intervallo" della classe list. –

+0

Potresti aggiungere un pulsante e un metodo allegato che visualizza un valore da ciascuno dei tuoi TList? Forse quello che non mostra è quello che è morto? Questo lo restringerebbe? Sono d'accordo sul fatto che potrebbe essere in definitiva meno lavoro prendere familiarità con lo strumento di debug di JCL, madExcept o EurekaLog perché lo strumento giusto trova molti usi ... – Argalatyr

9

madExcept (gratuito) o EurekaLog (a pagamento) può aiutare. Puoi impostarli per mostrare/inviare via email una traccia stack quando si verifica un errore. Uso EurekaLog in tutti i miei progetti e ha un valore inestimabile per risolvere questo tipo di cose.

+2

FYI madExcept è gratuito solo per uso non commerciale. –

+0

Suppongo che uno di quei programmi (non li ho mai provati) funzionerà. Ma sono un po 'eccessivo se non voglio aggiungere una segnalazione avanzata degli errori nel mio pacchetto distribuibile. Posso andare con uno di loro (qualche consiglio su quale sia meglio?), Ma speravo davvero in una soluzione più semplice. – lkessler

+3

Il JCL ha un'offerta simile ed è davvero gratuito. –

3

Poiché si tratta di un errore RTL/VCL, spesso si verifica un comportamento di interruzione/callback migliore se si attiva Debug DCU (e si ricompila).

+0

Non ho avuto bisogno di provarlo (vedi la soluzione sopra), ma grazie per l'idea. – lkessler

7

Ehi, non hai bisogno di strumenti aggiuntivi per tracciare questo! :)

Basta eseguire l'applicazione in debugger e assicurarsi che "Stop su Delphi Exceptions" (o qualsiasi altra cosa venga chiamata nella versione Delphi) sia attivato ON.

Quando si verifica un'eccezione, verrà visualizzata una notifica dal debugger. Premere il pulsante "Ok"/"Debug" e visualizzare solo lo stack delle chiamate. La finestra dello stack delle chiamate viene visualizzata automaticamente nella recente versione di Delphi. Se non riesci a vederlo, vai su "Visualizza"/"Debug Windows"/"Call stack".

Questo è tutto. The call stack will point you at the exact location of the problem. Non è necessario alcuno strumento aggiuntivo.

Questi strumenti (EurekaLog, JCL o madExcept) sono necessari se si distribuisce il programma tra gli utenti e si desidera raccogliere segnalazioni di errori sui client. Cioè non c'è un debugger per controllare il problema.

+1

Vedo anche una strana parola non standard in didascalia: "Guarda";) – Alex

+0

Speriamo che "Behold" sarà presto uno standard. :-) – lkessler

+0

Questa è una versione della risposta semplice che stavo cercando. Lo controllerò quando torno a casa oggi. – lkessler

0

per casella di riepilogo, tstrings, ... significa che l'indice è oltre l'elenco-> conta,. . esempio di tString-> strnigs [?]; [?] è < 0 o> (tString-> count-1) risulta dall'errore di limiti.

come per NMPop3, ecc., ... se si usa pop3client per recuperare e-mail, ha qualche bug su unix /? server pop3, che mi sono imbattuto usandolo per recuperare e-mail dalla posta .???.com ma ok con alcuni.

finalmente devo riscrivere la mia applicazione pop3client con tclientsocket invece di tnmpop3. ora funziona con tutti i pop3server a cui mi sono collegato.

speranza questo aiuto & buona fortuna