SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Rund um die LCL und andere Komponenten
Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von h-elsner »

Ich habe das jetzt mal beim funktionierendem System gemacht.

Code: Alles auswählen

<TBUILTINLISTCHARTSOURCE> = {
  <TLISTCHARTSOURCE> = {
    <TCUSTOMSORTEDCHARTSOURCE> = {
      <TCUSTOMCHARTSOURCE> = {
        <TBASICCHARTSOURCE> = {
          <TCOMPONENT> = {
            <TPERSISTENT> = {
              <TOBJECT> = {
                _vptr$TOBJECT = $b9c278}, 
              FOBSERVERS = $0}, 
            FOWNER = $7ffff5c2a200, 
            FNAME = 'Builtin', 
            FTAG = 0, 
            FCOMPONENTS = $0, 
            FFREENOTIFIES = $0, 
            FDESIGNINFO = 0, 
            FVCLCOMOBJECT = $0, 
            FCOMPONENTSTATE = [], 
            FCOMPONENTSTYLE = [CSINHERITABLE], 
            COMPONENTSTATE = [], 
            COMPONENTSTYLE = [CSINHERITABLE], 
            DESIGNINFO = 0, 
            OWNER = $7ffff5c2a200, 
            VCLCOMOBJECT = $0, 
            NAME = 'Builtin', 
            TAG = 0}, 
          FBROADCASTER = $7ffff7fb1200, 
          FUPDATECOUNT = 0, 
          BROADCASTER = $7ffff7fb1200}, 
        FERRORBARDATA = {
          0x7ffff7fbc3c0, 
          0x7ffff7fbc420}, 
        FBASICEXTENT = {
          A = {
            X = inf, 
            Y = inf}, 
          B = {
            X = -inf, 
            Y = -inf}, 
          COORDS = {
            inf, 
            inf, 
            -inf, 
            -inf}}, 
        FBASICEXTENTISVALID = true, 
        FCUMULATIVEEXTENT = {
          A = {
            X = inf, 
            Y = inf}, 
          B = {
            X = -inf, 
            Y = -inf}, 
          COORDS = {
            inf, 
            inf, 
            -inf, 
            -inf}}, 
        FCUMULATIVEEXTENTISVALID = true, 
        FXLISTEXTENT = {
          A = {
            X = inf, 
            Y = inf}, 
          B = {
            X = -inf, 
            Y = -inf}, 
          COORDS = {
            inf, 
            inf, 
            -inf, 
            -inf}}, 
        FXLISTEXTENTISVALID = true, 
        FYLISTEXTENT = {
          A = {
            X = inf, 
            Y = inf}, 
          B = {
            X = -inf, 
            Y = -inf}, 
          COORDS = {
            inf, 
            inf, 
            -inf, 
            -inf}}, 
        FYLISTEXTENTISVALID = true, 
        FVALUESTOTAL = 0, 
        FVALUESTOTALISVALID = true, 
        FSORTBY = SBX, 
        FSORTDIR = SDASCENDING, 
        FSORTINDEX = 0, 
        FXCOUNT = 1, 
        FYCOUNT = 1, 
        SORTBY = SBX, 
        SORTDIR = SDASCENDING, 
        SORTINDEX = 0, 
        XCOUNT = 1, 
        YCOUNT = 1}, 
      FUSESORTEDAUTODETECTION = true, 
      FONCOMPARE = {
        Proc = {
          function  (POINTER, 
          POINTER, 
          POINTER) : LONGINT} 0x7ffff61da1c0, 
        Self = $0}, 
      FDATA = $7ffff7fb3aa0, 
      FSORTED = false, 
      FSORTEDAUTODETECTED = true, 
      ONCOMPARE = {
        Proc = {
          function  (POINTER, 
          POINTER, 
          POINTER) : LONGINT} 0x7ffff61da1c0, 
        Self = $0}, 
      SORTED = false, 
      USESORTEDAUTODETECTION = true}, 
    FDATAPOINTS = $7ffff61c4040, 
    DATAPOINTS = $7ffff61c4040}, 
  FXCOUNTMIN = 0, 
  FYCOUNTMIN = 1}
Dies ist das Ergebnis in ganz am Anfang in Form.Create.
Diese Adresse taucht dann auch wieder als Owner in function TChartSeries.GetSource: TCustomChartSource; auf.

Wie gesagt, da läuft es ohne Probleme durch. Ich schaue jetzt mal auf dem anderen Rechner nach, aber ich denke, da ist es auch so. Es war auch so, dass der erste Durchlauf mit den gleichen Adressen daherkam und funktioniert hat. Erst dann der zweite Durchlauf brachte den Absturz.
Bildschirmfoto zu 2021-09-01 17-25-06.png
Bildschirmfoto zu 2021-09-01 17-25-06.png (192.09 KiB) 1543 mal betrachtet
Gruß HE

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von h-elsner »

Ich habe mal das Kompilat von Lazarus 2.2.0RC2 auf dem Notebook ausprobiert und es läuft. Den gleichen Quelltext mit Lazarus 2.0.12 auf dem Notebook kompiliert führt beim 2. Aufruf wieder zu Access violation.

Die FOWNER sind auch hier beim Programmstart $7ffff5a363a0 und dann als Result von function TChartSeries.GetSource: TCustomChartSource; FOWNER = $7ffff5a363a0, also gleich.

Jetzt hab ich mir mal die Results von function TChartSeries.ListSource: TListChartSource; angesehen. Da steht bei FNAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, aber sowohl beim 1. funktionierendem Durchlauf als auch beim 2. mit Access violation.

Code: Alles auswählen

1. Aufruf Neu Berechnen (funktioniert)

1. Durchlauf function TChartSeries.ListSource: TListChartSource; 

Result=
<TLISTCHARTSOURCE> = {
  <TCUSTOMCHARTSOURCE> = {
    <TBASICCHARTSOURCE> = {
      <TCOMPONENT> = {
        <TPERSISTENT> = {
          <TOBJECT> = {
            _vptr$TOBJECT = $10407}, 
          FOBSERVERS = $5b1000}, 
        FOWNER = $30, 
        FNAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, 
        FTAG = 10555936, 
        FCOMPONENTS = $a46cb8, 
        FFREENOTIFIES = $0, 
        FDESIGNINFO = 0, 
        FVCLCOMOBJECT = $0, 
        FCOMPONENTSTATE = [CSDESTROYING..CSANCESTOR, CSFREENOTIFICATION..CSINLINE], 
        FCOMPONENTSTYLE = [], 
        COMPONENTSTATE = [CSDESTROYING..CSANCESTOR, CSFREENOTIFICATION..CSINLINE], 
        COMPONENTSTYLE = [], 
        DESIGNINFO = 0, 
        OWNER = $30, 
        VCLCOMOBJECT = $0, 
        NAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, 
        TAG = 10555936}, 
      FBROADCASTER = $0, 
      FUPDATECOUNT = 0, 
      BROADCASTER = $0}, 
    FERRORBARDATA = {
      0x0, 
      0x4a4380}, 
    FEXTENT = {
      A = {
        X = 2.170782156920435e-317, 
        Y = 2.1708770175244366e-317}, 
      B = {
        X = 2.1711615993364411e-317, 
        Y = 2.1715647569034476e-317}, 
      COORDS = {
        2.170782156920435e-317, 
        2.1708770175244366e-317, 
        2.1711615993364411e-317, 
        2.1715647569034476e-317}}, 
    FEXTENTISVALID = 144, 
    FVALUESTOTAL = 2.1716279973061153e-317, 
    FVALUESTOTALISVALID = 48, 
    FXCOUNT = 0, 
    FYCOUNT = 4394656, 
    XCOUNT = 0, 
    YCOUNT = 4394656}, 
  FDATA = $430fb0, 
  FDATAPOINTS = $4318d0, 
  FSORTED = 224, 
  DATAPOINTS = $4318d0, 
  SORTED = 224}


2. Durchlauf function TChartSeries.ListSource: TListChartSource; 

Result=
<TLISTCHARTSOURCE> = {
  <TCUSTOMCHARTSOURCE> = {
    <TBASICCHARTSOURCE> = {
      <TCOMPONENT> = {
        <TPERSISTENT> = {
          <TOBJECT> = {
            _vptr$TOBJECT = $10407}, 
          FOBSERVERS = $5b1000}, 
        FOWNER = $30, 
        FNAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, 
        FTAG = 10555936, 
        FCOMPONENTS = $a46cb8, 
        FFREENOTIFIES = $0, 
        FDESIGNINFO = 0, 
        FVCLCOMOBJECT = $0, 
        FCOMPONENTSTATE = [CSDESTROYING..CSANCESTOR, CSFREENOTIFICATION..CSINLINE], 
        FCOMPONENTSTYLE = [], 
        COMPONENTSTATE = [CSDESTROYING..CSANCESTOR, CSFREENOTIFICATION..CSINLINE], 
        COMPONENTSTYLE = [], 
        DESIGNINFO = 0, 
        OWNER = $30, 
        VCLCOMOBJECT = $0, 
        NAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, 
        TAG = 10555936}, 
      FBROADCASTER = $0, 
      FUPDATECOUNT = 0, 
      BROADCASTER = $0}, 
    FERRORBARDATA = {
      0x0, 
      0x4a4380}, 
    FEXTENT = {
      A = {
        X = 2.170782156920435e-317, 
        Y = 2.1708770175244366e-317}, 
      B = {
        X = 2.1711615993364411e-317, 
        Y = 2.1715647569034476e-317}, 
      COORDS = {
        2.170782156920435e-317, 
        2.1708770175244366e-317, 
        2.1711615993364411e-317, 
        2.1715647569034476e-317}}, 
    FEXTENTISVALID = 144, 
    FVALUESTOTAL = 2.1716279973061153e-317, 
    FVALUESTOTALISVALID = 48, 
    FXCOUNT = 0, 
    FYCOUNT = 4394656, 
    XCOUNT = 0, 
    YCOUNT = 4394656}, 
  FDATA = $430fb0, 
  FDATAPOINTS = $4318d0, 
  FSORTED = 224, 
  DATAPOINTS = $4318d0, 
  SORTED = 224}

Danach geht es mit F7 weiter - alles OK, Kurve wird gezeichnet

/////////////////////////////////////////////////////

2. Aufruf Neu Berechnen (funktioniert dann nicht mehr)

1. Durchlauf function TChartSeries.ListSource: TListChartSource;

Result=
<TLISTCHARTSOURCE> = {
  <TCUSTOMCHARTSOURCE> = {
    <TBASICCHARTSOURCE> = {
      <TCOMPONENT> = {
        <TPERSISTENT> = {
          <TOBJECT> = {
            _vptr$TOBJECT = $10407}, 
          FOBSERVERS = $5b1000}, 
        FOWNER = $30, 
        FNAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, 
        FTAG = 10555936, 
        FCOMPONENTS = $a46cb8, 
        FFREENOTIFIES = $0, 
        FDESIGNINFO = 0, 
        FVCLCOMOBJECT = $0, 
        FCOMPONENTSTATE = [CSDESTROYING..CSANCESTOR, CSFREENOTIFICATION..CSINLINE], 
        FCOMPONENTSTYLE = [], 
        COMPONENTSTATE = [CSDESTROYING..CSANCESTOR, CSFREENOTIFICATION..CSINLINE], 
        COMPONENTSTYLE = [], 
        DESIGNINFO = 0, 
        OWNER = $30, 
        VCLCOMOBJECT = $0, 
        NAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, 
        TAG = 10555936}, 
      FBROADCASTER = $0, 
      FUPDATECOUNT = 0, 
      BROADCASTER = $0}, 
    FERRORBARDATA = {
      0x0, 
      0x4a4380}, 
    FEXTENT = {
      A = {
        X = 2.170782156920435e-317, 
        Y = 2.1708770175244366e-317}, 
      B = {
        X = 2.1711615993364411e-317, 
        Y = 2.1715647569034476e-317}, 
      COORDS = {
        2.170782156920435e-317, 
        2.1708770175244366e-317, 
        2.1711615993364411e-317, 
        2.1715647569034476e-317}}, 
    FEXTENTISVALID = 144, 
    FVALUESTOTAL = 2.1716279973061153e-317, 
    FVALUESTOTALISVALID = 48, 
    FXCOUNT = 0, 
    FYCOUNT = 4394656, 
    XCOUNT = 0, 
    YCOUNT = 4394656}, 
  FDATA = $430fb0, 
  FDATAPOINTS = $4318d0, 
  FSORTED = 224, 
  DATAPOINTS = $4318d0, 
  SORTED = 224}

2. Durchlauf function TChartSeries.ListSource: TListChartSource;

Result=
<TLISTCHARTSOURCE> = {
  <TCUSTOMCHARTSOURCE> = {
    <TBASICCHARTSOURCE> = {
      <TCOMPONENT> = {
        <TPERSISTENT> = {
          <TOBJECT> = {
            _vptr$TOBJECT = $10407}, 
          FOBSERVERS = $5b1000}, 
        FOWNER = $30, 
        FNAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, 
        FTAG = 10555936, 
        FCOMPONENTS = $a46cb8, 
        FFREENOTIFIES = $0, 
        FDESIGNINFO = 0, 
        FVCLCOMOBJECT = $0, 
        FCOMPONENTSTATE = [CSDESTROYING..CSANCESTOR, CSFREENOTIFICATION..CSINLINE], 
        FCOMPONENTSTYLE = [], 
        COMPONENTSTATE = [CSDESTROYING..CSANCESTOR, CSFREENOTIFICATION..CSINLINE], 
        COMPONENTSTYLE = [], 
        DESIGNINFO = 0, 
        OWNER = $30, 
        VCLCOMOBJECT = $0, 
        NAME = $ffffffffffffffd0 <error: Cannot access memory at address 0xffffffffffffffd0>, 
        TAG = 10555936}, 
      FBROADCASTER = $0, 
      FUPDATECOUNT = 0, 
      BROADCASTER = $0}, 
    FERRORBARDATA = {
      0x0, 
      0x4a4380}, 
    FEXTENT = {
      A = {
        X = 2.170782156920435e-317, 
        Y = 2.1708770175244366e-317}, 
      B = {
        X = 2.1711615993364411e-317, 
        Y = 2.1715647569034476e-317}, 
      COORDS = {
        2.170782156920435e-317, 
        2.1708770175244366e-317, 
        2.1711615993364411e-317, 
        2.1715647569034476e-317}}, 
    FEXTENTISVALID = 144, 
    FVALUESTOTAL = 2.1716279973061153e-317, 
    FVALUESTOTALISVALID = 48, 
    FXCOUNT = 0, 
    FYCOUNT = 4394656, 
    XCOUNT = 0, 
    YCOUNT = 4394656}, 
  FDATA = $430fb0, 
  FDATAPOINTS = $4318d0, 
  FSORTED = 224, 
  DATAPOINTS = $4318d0, 
  SORTED = 224}

Dann F7 bringt Access Violation.
Was mir auffällt ist, dass beim RC2 Lazarus das Result von function TChartSeries.ListSource: TListChartSource;
so aussieht: <TLISTCHARTSOURCE> = $d00000090, nix weiter.

Kann natürlich sein, dass ich etwas falsch eingestellt habe, aber die anderen Results von Functions gleichen sich.

Gruß HE

Gruß HE

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

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von wp_xyz »

Da steht viel Käse drin (z.B. TAG = 10555936 - soviel ich weiß, wird das Tag gar nicht verwendet, oder FYCOUNT = 4394656 - du hat nur 1 Y-Wert) ... Aber ich weiß auch nicht, ob das nicht am Debugger liegt.

Hab' mir jetzt eine VM mit Mint 20.2 Cinnamon 64bit gebaut mit Laz 2.0.12/FPC 3.2.0 (gtk2) und kann das Problem wieder nicht bestätigen. Es ist bei Lazarus noch die Grundinstallation, keine weiteren Packages. Es könnte sein, dass dir eines deiner Packages das Ei ins Nest gelegt hat.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von h-elsner »

Komisch. Ich habe Lazarus 2.0.12 mit fcpupdeluxe nochmal neu installiert (alles von vorher gelöscht) und habe auf dem Notebook wieder das gleiche Problem. Es sind keine zusätzlichen Komponenten installiert.

Außerdem hatte ich je den Effekt auf dem Notebook und auf dem PC. Die Installationen waren zu verschiedenen Zeiten (mehr als 1 Monat dazwischen). Es sieht wie man es auch dreht mysteriös aus.
Aber egal, ich habe ja jetzt wieder etwas lauffähiges. Und als Bonus eine ganze Menge zum Debugger gelernt. Danke für die Hilfe.

Gruß HE

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von fliegermichl »

Vielleicht hilft die Debuggereinstellung "Trash Variables". Ich bin mir einigermassen sicher, daß da ein Pointer ins Nirvana zeigt.

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von h-elsner »

Trash variables habe ich eingestellt, sehe aber keinen Unterschied.

Das testprogramm wurde nochmal vereinfacht. Man kann leere Serien so oft löschen, wie man will. Wenn man aber nur einen Datenpunkt setzt, kommt beim Löschen der Access violation Fehler.

Das ist alles was man zum Nachstellen braucht:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1LineSeries2.Clear;   // x mal löschen möglich
  Chart1LineSeries2.Clear;
  Chart1LineSeries2.Clear;
  Chart1LineSeries2.AddXY(1, 1);
  Chart1LineSeries2.Clear;  / hier krachts dann
end;
Gruß HE

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

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von wp_xyz »

h-elsner hat geschrieben:
Do 2. Sep 2021, 11:24
Das testprogramm wurde nochmal vereinfacht. Man kann leere Serien so oft löschen, wie man will. Wenn man aber nur einen Datenpunkt setzt, kommt beim Löschen der Access violation Fehler.

Das ist alles was man zum Nachstellen braucht:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1LineSeries2.Clear;   // x mal löschen möglich
  Chart1LineSeries2.Clear;
  Chart1LineSeries2.Clear;
  Chart1LineSeries2.AddXY(1, 1);
  Chart1LineSeries2.Clear;  / hier krachts dann
end;
Das sieht schon nach einem Fehler in TAChart aus, daher will ich noch nicht aufgeben. Wenn ich es nur reproduzieren könnte!

Vor mich hingesponnen:
Wenn der Absturz im letzten Clear erfolgt, kann das daran liegen, dass AddXY etwas an der ListSource kaputt gemacht hat, so dass der folgende Zugriff auf die ListSource fehlschlägt - aber dann sollte es nicht möglich sein, wie in deinem anderen Programm weitere Punkte hinzuzufügen - oder der Absturz erfolgt innerhalb Clear, weil der Code nun in Routinen führt, die bei den ersten Aufrufen noch leer waren und übersprungen wurden. Das erscheint mir logischer.

Chart1Lineseries2.Clear ruft Chart1Lineseries2.ListSource.Clear auf, und der Code dort lautet:

Code: Alles auswählen

procedure TListChartSource.Clear; inline;
var
  i: Integer;
begin
  for i := 0 to FData.Count - 1 do
    Dispose(Item[i]);
  FData.Clear;
  ClearCaches;
  Notify;
end;
Kommst du mit dem Debugger dort rein, so dass man die Zeile mit dem Absturz identifizieren kann? Ich habe hier Probleme, weil die Procedure als inline markiert ist. Du könntest diverse WriteLn-Anweisungen einbauen (vorher ein Backup der Unit TASources machen):

Code: Alles auswählen

procedure TListChartSource.Clear; inline;
var
  i: Integer;
begin
  for i := 0 to FData.Count - 1 do
  begin
    WriteLn('i=', i, ' Item[i]^.X=', Item[i]^.X, ' .Y=', Item[i]^.Y);
    Dispose(Item[i]);
  end;
  WriteLn('Vor FData.Clear');
  FData.Clear;
  WriteLn('Vor ClearCaches');
  ClearCaches;
  WriteLn('Vor Notify');
  Notify;
  WriteLn('Nach Notify');
end;
Wenn du mit dem "-gw2" Tick arbeitest, dann wird die Änderung automatisch mit in das Testprojekt einkompiliert und du solltest im Ausgabefenster sehen, wie weit die Routine bis zum Crash gekommen ist.

Bei Windows nicht vergessen, in den Projekt-Optionen die Box "Win32-GUI-Anwendung (-WG)" zu markieren, damit das WriteLn keinen Fehler verursacht. Und am Ende der ganzen Arbeiten unbedingt nicht vergessen, den Originalzustand von TASources wiederherzustellen, sonst stürzen dir sämtlich TAChart-Programm mit einem nichts-sagenden "File not open"-Fehler ab (gemeint ist die Datei der Standardausgabe für das WriteLn).
Zuletzt geändert von wp_xyz am Do 2. Sep 2021, 16:48, insgesamt 1-mal geändert.

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von sstvmaster »

Hier mein Test:

- Ubuntu 20.04.3 in Virtualbox installiert mit fpcupdeluxe
- Lazarus 2.0.12 / fpc 3.2.2

Fehler auslösen: 2x Klick auf Clear, 1x klick auf Add, 1x klick auf Clear.
Boom.

Mein minimal Beispiel siehe Anhang.
Dateianhänge
Assembler.png
Assembler.png (71.14 KiB) 1436 mal betrachtet
SIGSEGV.png
SIGSEGV.png (11.19 KiB) 1436 mal betrachtet
Lazarus.png
Lazarus.png (126.24 KiB) 1436 mal betrachtet
Voltage_tmp3.zip
(3.92 KiB) 47-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von sstvmaster »

Mit trunk 2.3.0 + 3.3.1 funktioniert es.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von h-elsner »

Genauso ist es bei mir auch. Man kann Clear aufrufen so oft mal will so lange die Serie leer ist. Sobald man 1 oder mehrere Punkte addiert (es ist egal, wieviele Datenpunkte in der Serie sind, Hauptsache sie ist nicht jungfräulich leer), dann geht das Clear schief. Und es scheint nur bei Lazarus 2.0.12 stable aufzutreten.
Schlau ausgedacht, Add und Clear einzeln aufrufen zu können. Man kann da alle Kombinationen prüfen. Aber es wird wohl auf das oben gesagte hinauslaufen.
Schön, dass es überhaupt jemand nachstellen kann. Ich wollte schon alles mögliche deinstallieren und installieren. Das kann ich mir nun sparen.

@xyz: Soweit komme ich gar nicht, weil es schon bei der Function .ListSource in TACustomSeries aussteigt.

Gruß HE

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

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von wp_xyz »

Ich krieg's nicht hin. Jetzt habe ich noch den FPC 3.2.0 meiner Mint-VM gegen einen FPC 3.2.2 ersetzt, und der Fehler tritt immer noch nicht auf.

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

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von wp_xyz »

h-elsner hat geschrieben:
Do 2. Sep 2021, 17:43
@xyz: Soweit komme ich gar nicht, weil es schon bei der Function .ListSource in TACustomSeries aussteigt.
Das Problem ist, dass die eigentliche Clear Routine "inline" ist, und zumindest bei mir geht da der Debugger nicht rein, das heißt das letzte F7 bei deinem Screenshot 3__1021result.png führt dort hinein, aber der Debugger folgt diesem Schritt nicht. Mit den Writeln-Anweisungen würden wir sehen, wo genau es im TListChartSource.Clear kracht.

Was passiert eigentlich, wenn anstelle oder auch vor dem letzten Clear in dem Code von 11:24 heute ein Chart1LineSeries2.Delete(0) aufgerufen wird?

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von h-elsner »

Ich habe mich schon gewundert, dass das so übergangen wird, wegen inline also.
Ich hab mal ein Screenrecording gemacht, wo man die F7 Steps schön sieht.

https://1drv.ms/u/s!Au__y3NGLbYEjW7StZI ... Q?e=PI1KOa

Vielleicht hilft das.

Gruß HE

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von h-elsner »

Wenn man Chart1LineSeries2.Delete(0) davor setzt, ist die Serie wieder leer und der Fehler tritt nicht auf. Clear läuft ohne Probleme durch.

Gruß HE

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

Re: SIGSEGV beim Clear einer TLineSerie in TACharts (erledigt)

Beitrag von wp_xyz »

Delete macht genauso wie Clear das Dispose(Item), löscht dann aber den Item nochmals explizit aus der Liste, was Clear in einem Rutsch macht.

Könntest du das mal auch in TListChartSource.Clear einbauen?

Code: Alles auswählen

procedure TListChartSource.Clear; inline;
var
  i: Integer;
begin
  for i := FData.Count - 1 downto 0 do
  begin
    Dispose(Item[i]);
    FData.Delete(i);
   end;
   {
  for i := 0 to FData.Count - 1 do
    Dispose(Item[i]);
    }
  //FData.Clear;  // Kann eigentlich jetzt entfallen, da die Liste nun leer ist.
  ClearCaches;
  Notify;
end;

Antworten