Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Listenindex überschrietet das Maximum -> Welche Liste? (https://www.delphipraxis.net/71817-listenindex-ueberschrietet-das-maximum-welche-liste.html)

TheAn00bis 21. Jun 2006 14:21


Listenindex überschrietet das Maximum -> Welche Liste?
 
Hey,

wenn der Debugger (kommt das überhaupt vom Debugger?) die Fehlermeldung "Listendindex überschreitet das Maximum(...)" ausgibt, ist es dann möglich herauszufinden, um welche Liste es sich handelt, ohne (ewig ;)) den Quelltext durchforsten zu müssen? Oder weiß der Debugger selber nicht, um welche Liste es sich handelt?

Das würde häufig viel Zeit ersparen, vor allem, wenn es sich um Programme handelt, die nicht wirklich prozedual aufgebaut sind, weil durch einen Timer (z.B. das OnIdle) ständig etwas aufgerufen wird.

Ich denkmal nicht, dass es möglich ist, denn sonst würde es ja in der Fehlermeldung stehen, aber Fragen schadet ja nie...

P.S.: Diese Art der Fehlermeldung kommt ja irgendwann in der Laufzeit, wer sendet sie also? Das Programm selber oder der Delphi-Debugger oder wer?

DGL-luke 21. Jun 2006 14:24

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
Eigentlcih sollte der Debugger das abfangen und dir die Möglichkeit geben, direkt in die entsprechende Zeile zu springen.

Ansonsten einfach ein paar Breakpoints machen, dann kannst du den fehler mit Heron eingrenzen :mrgreen:

TheAn00bis 21. Jun 2006 14:27

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
Zitat:

Zitat von DGL-luke
Eigentlcih sollte der Debugger das abfangen und dir die Möglichkeit geben, direkt in die entsprechende Zeile zu springen.

Ansonsten einfach ein paar Breakpoints machen, dann kannst du den fehler mit Heron eingrenzen :mrgreen:

Delphi gibt nur die Meldung aus, springt aber nicht in die Zeile. Außerdem kann es das Programm danach nicht beenden ("Prozess kann nicht beendet werden.") und nach etwa einer Minute bekomme ich Delphi schließlich beendet, denn vorher kann ich zwar im Quelltext etwas ändern, aber nicht neu compilieren. ;) Aber ich wollte das auch nicht auf mein Problem beziehen, sondern allgemein wissen.
Breakpoints machen das häufig nur geringfügig einfacher, wenn wie gesagt vieles so ziemlich gleichzeitig geschieht.

DGL-luke 21. Jun 2006 14:29

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
hmm.... du musst doch ungefähr wissen, wann dein programm auf welche liste zugreift.

aber hast du eventuell dem debugger gesagt, er soll "EListIndexOutOfBounds" ignorieren? (Wo ging das gleich noch mal? ;) muss irgendwo in den projektoptionen stehen)

shmia 21. Jun 2006 14:35

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
Die Liste hat keinen Namen, denn es ist keine Komponente.
Der Debugger kennt nur den Zeiger auf das Objekt. Er könnte dir den Klassennamen
([TObject].Classname) mitteilen, aber das hat Borland leider versäumt (vielleicht um die Benutzer nicht zu sehr zu verwirren).
==> Hier hilft nur debuggen:
Programm bis zur Exception rennen lassen.
Aufrufstack mit STRG-ALT-S anzeigen
und dann mit Einzelschritt weiter.

TheAn00bis 21. Jun 2006 14:41

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
Zitat:

Zitat von DGL-luke
hmm.... du musst doch ungefähr wissen, wann dein programm auf welche liste zugreift.

aber hast du eventuell dem debugger gesagt, er soll "EListIndexOutOfBounds" ignorieren? (Wo ging das gleich noch mal? ;) muss irgendwo in den projektoptionen stehen)

Ja, klar weiß ich das, aber es wäre um einiges angenehmer, wenn ich direkt und sicher wüsste, um welche Liste es sich handelt. Natürlich bekomme ich das Problem auch so gelöst, nur das dauert immer etwas länger.

Vielleicht hab ich dem Debugger echt mal gesagt, er solle "EListIndexOutOfBounds" ignoerieren? Ich finde die Einstellung gerade nicht, wenn jemand auf die schnelle weiß, wo ich das in Delphi2005 einstellen kann wäre ich dankbar.

Zitat:

Zitat von shmia
Die Liste hat keinen Namen, denn es ist keine Komponente.
Der Debugger kennt nur den Zeiger auf das Objekt. Er könnte dir den Klassennamen
([TObject].Classname) mitteilen, aber das hat Borland leider versäumt (vielleicht um die Benutzer nicht zu sehr zu verwirren).
==> Hier hilft nur debuggen:
Programm bis zur Exception rennen lassen.
Aufrufstack mit STRG-ALT-S anzeigen
und dann mit Einzelschritt weiter.

Okay, schade, hätte ja sein können. :)

TonyR 21. Jun 2006 14:45

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
Bei der Fehlermeldung "Listenindex überschreitet das Maximum" (die auch schon häufig bekam) hat es sich bei mir darum gehandelt, dass ich auf ein Element in einer Liste zugegriffen habe was es gar nicht gab.
Z.B.: Liste mit 5 Elementen - Zugriff auf Element 6 oder -1

DGL-luke 21. Jun 2006 14:50

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
das wissen wir schon. aber trotzdem danke.

nochmal:

kannst du die meldung mal posten? wenn die meldung kommt, einfach strg+c.

TheAn00bis 21. Jun 2006 14:55

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
Zitat:

Zitat von DGL-luke
kannst du die meldung mal posten? wenn die meldung kommt, einfach strg+c.

Gerne, aber ich glaube nicht, dass es da viel zu entdecken gibt:

Zitat:

---------------------------
Brickprj
---------------------------
Listenindex überschreitet das Maximum (0)
---------------------------
OK
---------------------------

Luckie 21. Jun 2006 14:59

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
Wie viele (String)Listen hast du denn in deinem Programm, dass du nicht weißt welche es ist?

DGL-luke 21. Jun 2006 15:05

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
OK, das ist genau die Standard-Exception-Meldung, die du NICHT kriegen solltest, der Debugger sollte zuvor eine ähnliche meldung bringen, die dir aber die Möglichkeiten "Programm anhalten" und "Programm fortsetzen" anbietet.

TheAn00bis 21. Jun 2006 15:07

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
@Luckie

Es handelt sich um TObjectList.

Ich programmiere ein Spiel, dass vom Codeumfang für meine Verhältnisse schon ziemlich komplex ist (~1500 selbstgeschriebene Zeilen). Da ich für jeden Objekttypen eine eigene Liste habe sind es 8Listen. 2davon müssen auch über OpenGL abgebildet werden und es muss ständig auf Kollision etc. überprüft werden und die Objekte müssen sich bewegen, dies alles geschieht im OnIdle. Deshalb vermute ich, dass irgendwo beim Löschen noch auf die Liste zugegriffen wird, was dann in einer Exception endet, denn eigentlich überprüfe ich natürlich vor jedem Zugriff die Länge der Listen.

Zitat:

Zitat von DGL-luke
OK, das ist genau die Standard-Exception-Meldung, die du NICHT kriegen solltest, der Debugger sollte zuvor eine ähnliche meldung bringen, die dir aber die Möglichkeiten "Programm anhalten" und "Programm fortsetzen" anbietet.

Die kommt (manchmal) hinterher. Wie bekomme ich die Debugger-Meldung denn wieder?

Edit: Manchmal kommt die hier:

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt BrickPrj.exe ist eine Exception der Klasse EListError mit der Meldung 'Listenindex überschreitet das Maximum (0)' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Aber nur, wenn ich das Programm, nachdem es sich aufgehängt hat über Taskleiste->Schließen beende.

DGL-luke 21. Jun 2006 15:23

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
das is komisch... also die debugger-meldung sollte immer zuerst kommen... aufhängen sollte es sich natürlich auch nicht ^^

Kannst du mal folgendes probieren:
- exception auslösen, so dass das (standard-) fenster kommt
- in die ide wechseln
- "Programm anhalten" (nicht zurücksetzen!)
- Callstack ansehen ( evtl. mit strg+shift+C aufrufen)

Weisst du, was der callstack ist? eine kurze suche im forum sollte dir das auch sagen ;)

TheAn00bis 21. Jun 2006 15:31

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
Zitat:

Zitat von DGL-luke
das is komisch... also die debugger-meldung sollte immer zuerst kommen... aufhängen sollte es sich natürlich auch nicht ^^

Delphi hängt sich nach dieser Fehlermeldung immer so übel auf... ständig "Fehler beim setzen des Debug-Exception-Hook" und ähnliches; Sachen mit denen ich überhaupt nichts anfangen kann. :D

Der Callstack sieht so aus:

Zitat:

:7c81eb33 kernel32.RaiseException + 0x52
:00413ac6 TList.Get + $1E
Hilft mir das denn?

Edit: Ich solltte mich wohl mal ernsthaft mit Debugging auseinander setzen!

DGL-luke 21. Jun 2006 16:16

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
der callstack sollte länger sein! da solltest du irgendwann zu der methode kommen, in der TList.get aufgerufen wird....

(wenns blöd läuft, kommst du nur zu DefWndProc ^^)

TheAn00bis 21. Jun 2006 16:21

Re: Listenindex überschrietet das Maximum -> Welche Liste
 
edit5: Vergesst, was hier stand, das war vermutlich Unsinn und da blickt sowieso keiner durch.

Wie kann es denn sein, dass bei einigen Exceptions die Zeile und alles angezeigt werden und manchmal gar nicht? Wenn ich nämlich andere Listen lösche, dann wird die Zeile angezeigt - aber auch nicht bei allen!

Zitat:

Zitat von DGL-luke
der callstack sollte länger sein! da solltest du irgendwann zu der methode kommen, in der TList.get aufgerufen wird....

(wenns blöd läuft, kommst du nur zu DefWndProc ^^)

Ist er aber nicht... Callstack = Aufrufstack, richtig?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz