TsWorksheetGrid: SIGSEGV im AVL-Tree

Rund um die LCL und andere Komponenten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TsWorksheetGrid: SIGSEGV im AVL-Tree

Beitrag von af0815 »

Der Fehler war jetzt mal weg und kein Problem. Jetzt habe ich Heaptrace wieder aktiviert und BOOM.

Und diesmal in AVLTree.BalanceAfterInsert.

Code: Alles auswählen

#0 BALANCEAFTERINSERT(0x193624a8, 0x194a32b0) at laz_avl_tree.pp:519
#1 ADD(0x193624a8, 0x193b7bb8) at laz_avl_tree.pp:330
#2 ADD(0x193624a8, 0x193fa030) at laz_avl_tree.pp:249
#3 ADD(0x193624a8, 0, 0) at source\common\fpsclasses.pas:660
#4 ADDCELL(0x193624a8, 0, 0) at source\common\fpsclasses.pas:999
#5 ADDCELL(0x11ca95e0, 0, 0) at source\common\fpspreadsheet.pas:2270
#6 GETCELL(0x11ca95e0, 0, 0) at source\common\fpspreadsheet.pas:2393
#7 WRITEBACKGROUNDCOLOR(0x11ca95e0, 0, 0, 15132390) at source\common\fpspreadsheet.pas:6455
#8 CB_CHANGE(0x13b103b0, 0x0) at framesxxx\frablxls.pas:260
in function TAVLTree.Add(Data: Pointer): TAVLTreeNode; entsteht der Node der in procedure TAVLTree.Add(ANode: TAVLTreeNode); dann den falschen Parent hat.

Edit: Wenn ich jetzt Heaptrace ausschalte so ist der Fehler wieder weg.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TsWorksheetGrid: SIGSEGV im AVL-Tree

Beitrag von af0815 »

Das Problem ist noch immer da.
#0 LAZ_AVL_TREE$_$TAVLTREENODE_$__$$_SUCCESSOR$$TAVLTREENODE+80 at :0
#1 FPSCLASSES$_$TSROWCOLENUMERATOR_$__$$_MOVENEXT$$BOOLEAN+596 at :0
#2 FPSPREADSHEETGRID$_$TSCUSTOMWORKSHEETGRID_$__$$_AUTOADJUSTCOLUMN$LONGINT+440 at :0
#3 FPSPREADSHEETGRID$_$TSCUSTOMWORKSHEETGRID_$__$$_AUTOCOLWIDTH$LONGINT+27 at :0
#4 TFrameX00XFehler.CB_Change(TFrameX00XFehler($1AB6ECF0), nil) at C:\Data\Xxxx\Yyyyyyy\MyPrg\source\framesX00X\frX00Xfehler.pas:292
#5 TFrameX00XFehler.Select(TFrameX00XFehler($1AB6ECF0)) at C:\Data\Xxxx\Yyyyyyy\MyPrg\source\framesX00X\frX00Xfehler.pas:425
#6 TFrameX00XMain.TS_FehlerShow(TFrameX00XMain($14B2E730), TObject($14B2F7D0)) at C:\Data\Xxxx\Yyyyyyy\MyPrg\source\framesX00X\frX00Xmain.pas:112
#7 COMCTRLS$_$TCUSTOMPAGE_$__$$_DOSHOW+39 at :0
#8 COMCTRLS$_$TCUSTOMPAGE_$__$$_CMVISIBLECHANGED$TMESSAGE+47 at :0
#9 SYSTEM$_$TOBJECT_$__$$_DISPATCH$formal+145 at :0
Lazarus 2.3.0 (rev main-2_3-3449-g1b9d3d4cbf) FPC 3.2.3 i386-win32-win32/win64
Es spießt sicher immer beim traversieren, das er da im AVL-Tree quasi über den letzten Parent kommt. Das ist hartnäckig und kommt nur in einer ganz speziellen Konstellation zutage. Und es besteht in beiden Richtungen also nicht nur Succesor.

Was mich dabei am meisten stört, die SIGSEGV Meldung lässt sich nicht unterdrücken. Weil scheinbar tritt das nur beim ersten Mal auf. Wenn ich die Fehlermeldung ignoriere und bestätige, dann geht alles ohne Probleme. Nur das Auftauchen des SIGSegV ist aktuell störend.
Mal sehen ob ich die Feldbreite auch anders bestimmen kann, statt mit dem AutoColWith.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TsWorksheetGrid: SIGSEGV im AVL-Tree

Beitrag von wp_xyz »

Es gab vor ein paar Tagen ein paar Änderungen im Laz-AVL-Tree. Vielleicht wurde damit auch das Problem behoben?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TsWorksheetGrid: SIGSEGV im AVL-Tree

Beitrag von af0815 »

Ich kann dich beruhigen, es ist nicht besser geworden. Clean Build etc. natürlich gemacht.

Soweit ich das verfolgen kann, entsteht das Problem, wenn er mit dem Enumerator im Baum links oder rechts hochsteigt. Dabei versagt wie auch immer die Erkennung der Root-Wurzel. Genau dort passiert es, es wird versucht über die Root hinaus zuzugreifen. Was mir auffällt, das Heaptrace das ganze verschlimmern kann, besonders wenn man Trash Variablen verwendet. Da hatte ich zuerst den Verdacht das ein gelöschtes Objekt statt mit nil, mit einem 'getrashten' Inhalt gefüllt wird und deswegen die Wurzelerkennung aussteigt in speziellen Konstellationen.

Das Grid wird bei mir per Programm aus einer Datenbank gefüllt. Daher werden immer ganz gleiche Verhaltensweisen gezeigt. Nur ist es mir noch nicht gelungen, das ganze heraus zu isolieren. Damit wäre es natürlich besser zu debuggen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten