SIGSEGV bei VirtualStringTree mit FPC Trunk

Rund um die LCL und andere Komponenten
Antworten
Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

SIGSEGV bei VirtualStringTree mit FPC Trunk

Beitrag von Michl »

Hallo,

ich nutze das VirtualTreeView-Package (V. 5.3.2.1) mit Lazarus- und FPC-Trunk unter Windows7. Dabei habe ich das Problem, dass ein External SIGSEGV geworfen wird, sobald ich auf eine Node im Tree eines VirtualStringTrees klicke (Lazarus 1.5 r49472M FPC 3.1.1 r31200). Unter Lazarus 1.4.0 FPC 2.6.4 tritt bei dem gleichen Projekt dieses Fehlverhalten nicht auf. Bis vor ca. einen halben Jahr im Trunk auch nicht (das letzte mal, als ich ein Projekt mit einem VST erstellt hatte).

Code: Alles auswählen

function TBaseVirtualTree.PackArray(TheArray: TNodeArray; Count: Integer): Integer; assembler;
 
// Removes all entries from the selection array which are no longer in use. The selection array must be sorted for this
// algo to work. Values which must be removed are marked with bit 0 (LSB) set. This little trick works because memory
// is always allocated DWORD aligned. Since the selection array must be sorted while determining the entries to be
// removed it is much more efficient to increment the entry in question instead of setting it to nil (which would break
// the ordered appearance of the list).
//
// On enter EAX contains self reference, EDX the address to TheArray and ECX Count
// The returned value is the number of remaining entries in the array, so the caller can reallocate (shorten)
// the selection array if needed or -1 if nothing needs to be changed.
 
asm
        PUSH    EBX
        PUSH    EDI
        PUSH    ESI
        MOV     ECX, EDX               //fpc: count is in EDX. Move to ECX
        MOV     ESI, [EBP+8]           //fpc: TheArray is in EBP+8
        MOV     EDX, -1
        JCXZ    @@Finish               // Empty list?
        INC     EDX                    // init remaining entries counter
        MOV     EDI, ESI               // source and destination point to the list memory
        MOV     EBX, 1                 // use a register instead of immediate operant to check against
@@PreScan:
        TEST    [ESI], EBX             // do the fastest scan possible to find the first entry       <--- hier kommt es zum SIGSEGV
Leider ist SourceForge z.Zt. nicht erreichbar, sodaß ich nicht nach einer neueren Version vom VTV schauen kann.

Kann diese Fehlverhalten jemand (evtl. unter einem anderen OS) bestätigen?

Kleines Beispiel, welches diesen Fehler auslöst, anbei.
Dateianhänge
BugProject.zip
(3.55 KiB) 85-mal heruntergeladen
Zuletzt geändert von Michl am Mo 16. Nov 2015, 19:36, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von wp_xyz »

Ich sehe in deinem Projekt nicht, wo du für die Node-Daten Speicher belegst (TVInitNodeEvent, oder New/GetMem vor Tree.AddChild)

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von Michl »

wp_xyz hat geschrieben:Ich sehe in deinem Projekt nicht, wo du für die Node-Daten Speicher belegst (TVInitNodeEvent, oder New/GetMem vor Tree.AddChild)
Hallo wp, das ist meiner Meinung nach nicht notwendig, da ich hier

Code: Alles auswählen

procedure TForm1.TreeGetNodeDataSize(
  Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
  NodeDataSize := SizeOf(TTreeData);
end; 
die Größe vorgebe und diese hier vom Tree selber

Code: Alles auswählen

function TBaseVirtualTree.MakeNewNode: PVirtualNode;
...
    if FNodeDataSize = -1 then
      ValidateNodeDataSize(FNodeDataSize);
 
    // Take record alignment into account.
    Inc(Size, FNodeDataSize);
  end;
 
  Result := AllocMem(Size + FTotalInternalDataSize);   
reserviert wird.

Das von mir gepostete Beispiel funktioniert unter dem Lazarus Release, nur nicht im Trunk und sollte dem vom Wiki entsprechen: http://wiki.freepascal.org/VirtualTreev ... or_Lazarus
Zuletzt geändert von Michl am Di 17. Nov 2015, 08:37, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von Michl »

Es gibt zum Glück eine Pascalvariante für die Funktion TBaseVirtualTree.PackArray, die man mit {$DEFINE PACKARRAYPASCAL} aktivieren kann. Das habe ich jetzt gemacht und das Projekt wird ordentlich ausgeführt.

Lt. Wiki http://wiki.freepascal.org/VirtualTreeview hat Christian die LCL-Portierung mit gearbeitet - falls er hier mitliest, kann er evtl. noch einmal ein Auge darauf werfen?! Meine Assemblerkenntnisse reichen dafür nicht.

Sollte ich diesen "Bug" im Bugtracker melden, es betrifft ja aber eine Komponente, die weder zu FreePascal noch zu Lazarus gehört, aber möglicherweise ein Fehler von FreePascal ist?

SourceForge ist leider immer noch nicht erreichbar.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von wp_xyz »

Ich würde das auf jeden Fall im BugTracker melden. VT gehört zu Lazarus-CCR, und dafür gibt es eine Rubrik im Bugtracker.

Michl
Beiträge: 2513
Registriert: Di 19. Jun 2012, 12:54

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von Michl »

Danke, werde ich machen, warte aber noch ab, bis die Code Repositories wieder oben sind und ich per SVN die letzte Version checken kann. https://twitter.com/sfnet_ops

[Edit]: habe es gepostet: http://bugs.freepascal.org/view.php?id=28502

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

hubblec4
Beiträge: 348
Registriert: Sa 25. Jan 2014, 17:50

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von hubblec4 »

Sorry wenn das nicht ganz zum thema passt.

@michl
Ich selbst möchte auch gerne dieses VST nutzen, habe aber im netz nur eine v.4.8.7.RC2 gefunden.
woher hast du deine 5.3.2.1 version.


hubblec4
Beiträge: 348
Registriert: Sa 25. Jan 2014, 17:50

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von hubblec4 »

theo hat geschrieben:http://sourceforge.net/p/lazarus-ccr/svn/3825/tree/components/virtualtreeview-new/trunk/
recht vielen dank, aber ich seh da nicht so ganz durch.

da sind jede menge links zu "files" welche man dann einzeln saugen müsste? gibt es da kein zip?

Benutzeravatar
theo
Beiträge: 11177
Registriert: Mo 11. Sep 2006, 19:01

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von theo »

Steht doch da: "Download Snapshot"

Oder wahlweise via SVN ( svn checkout svn://svn.code.sf.net/p/lazarus-ccr/svn/ lazarus-ccr-svn )

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

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von wp_xyz »

Allerdings sollte man erwähnen, dass du dir dadurch das ganze ccr-Archiv lädst - lösche anschließend einfach, was du nicht brauchst.

Benutzeravatar
theo
Beiträge: 11177
Registriert: Mo 11. Sep 2006, 19:01

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von theo »

wp_xyz hat geschrieben:Allerdings sollte man erwähnen, dass du dir dadurch das ganze ccr-Archiv lädst - lösche anschließend einfach, was du nicht brauchst.
Ja stimmt, am besten holt man es sich so:
svn co https://lazarus-ccr.svn.sourceforge.net ... eview-new/

hubblec4
Beiträge: 348
Registriert: Sa 25. Jan 2014, 17:50

Re: SIGSEGV bei VirtualStringTree mit FPC Trunc

Beitrag von hubblec4 »

theo hat geschrieben:Steht doch da: "Download Snapshot"

mmh. das hatte ich nicht wirklich für voll genommen :-)

ist ok wenn alles andere auch dabei ist, so riesig ist es ja nicht.

Antworten