Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TList.Count führt zu SIGSEGV Fehler (https://www.delphipraxis.net/168286-tlist-count-fuehrt-zu-sigsegv-fehler.html)

Noobmaster 13. Mai 2012 16:36

Delphi-Version: 5

TList.Count führt zu SIGSEGV Fehler
 
Hallo,

mein Programm bricht ab und es öffnet sich ein Assemblerfenster:

CLASSES_TLIST_$__GETCOUNT$$LONGINT
0042D2C3 8b4008 mov 0x8(%eax),%eax

Die für mich kryptische 2.Zeile ist hierbei mit einem grünen Pfeil gekennzeichnet, also schließe ich daraus, dass an dieser Stelle das Programm vom Debugger angehalten wird. Zusätzlich gibt mein Lazarus die Meldung eines SIGSEGV-Fehlers aus.

Kommentiere ich die Zeile
Delphi-Quellcode:
AnzWoerterInListe := pWortquelle.mWurzel[Wortlaenge].mWoerter[IndexBuchstabe].Count;
in meinem Projekt aus, tritt dieser Fehler nicht mehr auf.

pWortquelle.mWurzel[Wortlaenge].mWoerter[IndexBuchstabe] ist <> nil.

Weitere Informationen bei Nachfrage. Vielen vielen Dank schonmal für die Antworten!

Uwe Raabe 13. Mai 2012 16:58

AW: TList.Count führt zu SIGSEGV Fehler
 
Zitat:

Zitat von Noobmaster (Beitrag 1166333)
pWortquelle.mWurzel[Wortlaenge].mWoerter[IndexBuchstabe] ist <> nil.

und die so referenzierten Objekt-Instanzen sind auch noch gültig?

Noobmaster 13. Mai 2012 17:04

AW: TList.Count führt zu SIGSEGV Fehler
 
Wieso sollen sie nicht gültig sein, bzw. wie überprüfe ich die Gültigkeit?

wicht 13. Mai 2012 17:11

AW: TList.Count führt zu SIGSEGV Fehler
 
Zitat:

Wieso sollen sie nicht gültig sein
Ungültig heißt hier wohl, dass der Zeiger nicht nil ist, aber an der Adresse kein Objekt mehr liegt - z.B. weil du es irgendwo freigibst, aber dann die Referenz(en) nicht auf nil setzt.

Noobmaster 13. Mai 2012 17:14

AW: TList.Count führt zu SIGSEGV Fehler
 
Bei den Objekten handelt es sich um Instanzen von TList.
Der Destruktor der Objekte wurde an dieser Stelle noch nicht benutzt.
Meines Wissens nach müssten die Objekte gültig sein.

Noobmaster 13. Mai 2012 17:24

Präzisierung des Problems
 
Also genau genommen bin ich mir nicht 100% sicher, ob der Fehler an dieser Stelle liegt, aber da diese Zeile die einzige ist, in der ich die Count-Funktion der Liste benutze, gehe ich davon aus. Wenn ich das Programm in Einzelschritten durchlaufen lasse, komme ich nicht zu dem Fehler (die Funktion wird in einer Schleife aufgerufen, die sich so oft wiederholt, dass ich sie nicht komplett in Einzelschritten durchlaufen lassen kann).

jaenicke 13. Mai 2012 18:10

AW: Präzisierung des Problems
 
Zitat:

Zitat von Noobmaster (Beitrag 1166338)
die Funktion wird in einer Schleife aufgerufen, die sich so oft wiederholt, dass ich sie nicht komplett in Einzelschritten durchlaufen lassen kann).

Zuerst einen Haltepunkt setzen, in den Eigenschaften des Haltepunkts anhalten deaktivieren und bei Auswerten die Schleifenvariable eintragen. Dann schauen wann die Exception auftritt.
Wieder einen Haltepunkt setzen, diesmal mit anhalten, aber mit der Bedingung auf diesen Durchlauf (wenn es denn immer der selbe ist, also z.B. i = 133). Dann landest du genau dann dort, wenn es knallt.

Uwe Raabe 13. Mai 2012 19:31

AW: TList.Count führt zu SIGSEGV Fehler
 
Ist Range-Checking eingeschaltet?

Noobmaster 14. Mai 2012 09:47

AW: TList.Count führt zu SIGSEGV Fehler
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1166351)
Ist Range-Checking eingeschaltet?

Was ist das?

Also ich habe jetzt die Werte gefunden, wann
Delphi-Quellcode:
AnzWoerterInListe := pWortquelle.mWurzel[Wortlaenge].mWoerter[IndexBuchstabe].Count;
zu dem Fehler führt.
IndexBuchstabe muss, damit der Fehler auftritt, < 1 und > 26 sein.

Delphi-Quellcode:
               if IndexBuchstabe <= 0 then
               begin
                  x := x;
               end;
               if IndexBuchstabe > 26 then
               begin
                  y := y;
               end;
               AnzWoerterInListe := pWortquelle.mWurzel[Wortlaenge].mWoerter[IndexBuchstabe].Count;
Mit den if-Abfragen habe ich herausgefunden, dass dies aber nie der Fall ist.

Noobmaster 14. Mai 2012 09:57

Lösung
 
Der Fehler war, dass Wortlaenge = 0 war.
Danke für die Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 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