2009-07-28 5 views
10

In Delphi 2009 erzeugt mein Programm jetzt einen Fehler "List index out of bounds". Er erzeugt ein Popup-Fenster:Wie finde ich den Speicherort eines "List index out of bounds" -Fehlers in Delphi

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

ich die „Debug“ Build-Konfiguration bin mit, dass die Laufzeitfehler alle haben Prüfung eingeschaltet. Aber das fängt den Fehler nicht ein, bevor es passiert.

Gibt es eine einfache Möglichkeit, die Quelle dieses Fehlers in meinem Programm zu finden, ohne Haltepunkte einfügen und durch Versuch und Irrtum eingrenzen zu müssen?

+1

Ein weiterer +1 Überlauf Stack, für ein Forum und den anderen Experten bieten, die schnell half mir Vergangenheit ein Problem zu bekommen, dass ich nicht gefunden leicht die Lösung auf meinem hätte besitzen. – lkessler

+1

Einverstanden. Ich verstehe einfach nicht, warum meine Abstimmung diese Frage nur auf Null bringt. Gut gesagt, guter Screenshot und löste gute Antworten aus. Ich verstehe es einfach nicht. – Argalatyr

+3

Ich denke, wenn ich Upvotes wollte, hätte ich etwas fragen sollen: "Was ist dein Lieblings-Delphi-Cartoon?". Glücklicherweise war alles, was ich wollte, eine Lösung für mein Problem. – lkessler

Antwort

10

Haben Sie "Stop on Delphi Exceptions" eingeschaltet? (Extras \ Debugger-Optionen \ Sprachausnahmen [Delphi7]) Andernfalls wird Ihr Quellcode nicht unterbrochen.

Stellen Sie außerdem sicher, dass sich EListError nicht in der Liste "Zu ignorierende Ausnahmetypen" befindet. Diese Liste finden Sie auch unter Extras \ Debugger-Optionen \ Sprachausnahmen (Delphi 7).

+0

Dies ist eine andere (kam nach Alexander) Version der einfachen Antwort, die ich suchte. Ich werde es überprüfen, wenn ich später nach Hause komme. – lkessler

+1

Laut SO antwortete ich eine Stunde früher;) und ich sah Alexanders Antwort nicht, als ich meine veröffentlichte. Also, ich war zuerst: P –

+0

Interessant. Muss ein Zeitzonen-Ding sein, das SO falsch geht. Es heißt, du hast vor 14 Stunden geantwortet und Alexander hat vor 13 Stunden geantwortet. Aber wenn ich zuerst nach dem Ältesten sortiere, kommt deinerseits voran, also musst du in der Tat zuerst gewesen sein. – lkessler

0

Gibt es Hinweise, was Ihre Anwendung tut, wenn dies auftritt? Eine lange Schleife? Ein Knopf klicken?

Wenn die Anwendung angehalten wird und Sie das Debug-Fenster des Aufruf-Stacks betrachten, können Sie den Aufruf zurück zum letzten Aufruf Ihres Codes verfolgen? Der Aufruf-Stack wird Ihnen nicht alle Bedingungen mitteilen, kann jedoch den Standort eingrenzen.

Sobald Sie den Anruf eingrenzen, kann ein Protokollierungswerkzeug wie CodeSite wirklich nützlich sein. Zum Beispiel protokolliere ich häufig Schleifensteuerungsvariablen, um herauszufinden, welche Iteration zuletzt vor dem Fehler auftritt, dann geht es darum, wahrscheinliche Verdächtige zu identifizieren.

+0

Ich weiß, dass es sich um einen Out-of-Bounds-Fehler in einem der vielen TLists handelt, die entweder mein Programm oder eine Komponente in meinem Programm verwendet. Ich bin überrascht, dass die Überprüfung der Grenzen dies nicht erfasst. Die Anwendung wird nicht angehalten. Es geht weiter, nachdem ich die OK-Taste gedrückt habe, aber einige Funktionen fehlen. Wenn ich den Anruf finden konnte, dann werde ich wissen, wo der Fehler ist. Aber es ist schwierig, den Ruf zu finden. – lkessler

+1

Die Überprüfung von Bounds würde es nicht abfangen, da die Überprüfung der Grenzen für arithmetische Operationen (Überlauf) gilt. Sie meinen Range-Checking, aber Bereichsüberprüfung * kann es nicht fangen, weil das nur für Arrays gilt, nicht für Klassen. Die Fehlermeldung, die Sie sehen, ist ein Ergebnis der eigenen "Bereichsprüfung" der Listenklasse. –

+0

Können Sie eine Schaltfläche und eine angehängte Methode hinzufügen, die einen Wert von jedem Ihrer TLists anzeigt? Vielleicht ist derjenige, der nicht gestorben ist, derjenige, der gestorben ist? Würde es das eingrenzen? Ich stimme zu, dass es letztendlich weniger Arbeit ist, sich mit dem JCL-Debug-Tool, madExcept oder EurekaLog vertraut zu machen, da das richtige Tool viele Anwendungen findet ... – Argalatyr

9

madExcept (kostenlos) oder EurekaLog (bezahlt) kann helfen. Sie können sie so einrichten, dass sie bei Auftreten eines Fehlers eine Stack-Trace anzeigen/mailen. Ich benutze EurekaLog in all meinen Projekten und es ist von unschätzbarem Wert, um solche Dinge zu reparieren.

+2

FYI madExcept ist nur für nicht-kommerzielle Nutzung frei. –

+0

Ich vermute, dass eines dieser Programme (ich habe sie noch nie ausprobiert) funktioniert. Aber sie sind ein wenig übertrieben, wenn ich keine erweiterten Fehlerberichte in mein verteilbares Paket einfügen möchte. Ich kann mit einem von ihnen gehen (irgendwelche Empfehlungen, was ist besser?), Aber ich habe wirklich auf eine einfachere Lösung gehofft. – lkessler

+3

Die JCL hat ein ähnliches Angebot und ist wirklich kostenlos. –

3

Da dies ein RTL/VCL-Fehler ist, haben Sie oft ein besseres Break-/Callstack-Verhalten, wenn Sie Debug-DCUs (und Neuaufbau) aktivieren.

+0

Ich musste es nicht versuchen (siehe obige Lösung), aber danke für die Idee. – lkessler

7

Hey, du brauchst keine zusätzlichen Tools, um dies zu verfolgen! :)

Führen Sie einfach Ihre Anwendung unter Debugger und stellen Sie sicher, dass "Stop on Delphi Exceptions" (oder wie auch immer es in Ihrer Delphi-Version genannt wird) ON.

Wenn eine Ausnahme auftritt, wird eine Benachrichtigung vom Debugger ausgegeben. Klicken Sie auf "Ok"/"Debug" und sehen Sie sich den Call-Stack an. Call-Stack-Fenster wird automatisch in der neuesten Delphi-Version angezeigt. Wenn Sie es nicht sehen können, gehen Sie zu "View"/"Debug Windows"/"Call Stack".

Das ist alles. The call stack will point you at the exact location of the problem. Kein zusätzliches Werkzeug benötigt.

Diese Tools (EurekaLog, JCL oder madExcept) werden benötigt, wenn Sie Ihr Programm an Benutzer verteilen und Fehlerberichte über Probleme auf der Clientseite sammeln möchten. I.e. Es gibt keinen Debugger, um das Problem zu überprüfen.

+1

Ich sehe auch ein seltsames Nicht-Standard-Wort in der Überschrift: "Siehe";) – Alex

+0

Hoffentlich wird "Siehe" bald ein Standard sein. :-) – lkessler

+0

Dies ist eine Version der einfachen Antwort, nach der ich gesucht habe. Ich werde es überprüfen, wenn ich später nach Hause komme. – lkessler

0

für Listbox, Tstrings, ... bedeutet, dass der Index außerhalb der Liste ist -> count,. . Beispiel für tString-> Strnigs [?]; [?] ist < 0 oder> (tString-> count-1) führt zu einem Fehler außerhalb der Grenzen.

wie für NMPop3, etc, ... Wenn Sie pop3client verwenden, um E-Mails zu holen, hat es einen Fehler zu einigen Unix /? Pop3-Server, , die ich über die Verwendung von E-Mail von Mail gekommen bin.???.com aber ok mit einigen.

Endlich muss ich meine pop3client Anwendung mit tclientsocket anstelle von tnmpop3 umschreiben. funktioniert jetzt mit jedem pop3server, mit dem ich verbunden bin.

Hoffnung diese Hilfe & Glück