Page 1 of 1

Crash in TFastLineSeries.Clear

Posted: Fri Mar 27, 2020 3:40 pm
by 16585377
Hello,

Since version V2019.28 we see often the following crash (not reproducible in a test project yet)
when freeing a window with a TChart:
callStackCapture.PNG
callStackCapture.PNG (23.08 KiB) Viewed 3068 times
The multiple TFastLineSeries are created runtime like that:

Code: Select all

procedure CreateNewSeries(ParentChart: TChart; SeriesTitle: string;
                          SeriesColor: TColor; SeriesLineWidth: Integer;
                          ProfilePoints: TProfilePoints);
var
  i: Integer;
  tmpLineSeries: TFastLineSeries;
begin
  if Length(ProfilePoints) > 0 then
  begin
    tmpLineSeries := TFastLineSeries.Create(ParentChart);
    tmpLineSeries.ParentChart := ParentChart;
    tmpLineSeries.BeginUpdate;
    try
      tmpLineSeries.Color := SeriesColor;
      tmpLineSeries.Title := SeriesTitle;
      tmpLineSeries.LinePen.Width := SeriesLineWidth;
      for i := 0 to High(ProfilePoints) do
        tmpLineSeries.AddXY(ProfilePoints[i].X, ProfilePoints[i].Y);
    finally
      tmpLineSeries.EndUpdate;
      tmpLineSeries.Active := True;
    end;
  end;
end;
When we use older TChert sources or when we use TLineSeries instead of TFastLineSeries no such crashes occur.
Any thoughts about what could happen in TFastLineSeries.Clear or what could be wrong with creation of the TFastLineSeries?

best regards

Re: Crash in TFastLineSeries.Clear

Posted: Fri Mar 27, 2020 4:39 pm
by yeray
Hello,

I've been trying to reproduce the problem with your code in a simple example without success. The call stack looks like the one you've posted but Clear method ends without errors.
While you can't send us a simple example, if you can tell us in what TeeChart version you weren't reproducing the problem, it may help us to reduce the scope.

Re: Crash in TFastLineSeries.Clear

Posted: Fri Mar 27, 2020 5:25 pm
by 16585377
Hi Yeray,

we see these crashes and call stacks since version V2019.28.
Before that version, we were using V2018.25.180808 (I update the code November 13th 2018) and I updated TChart sources on
December 10th 2018 (don't know what versions that was) without any crashes.
So from version V2019.28 on we see this call stack, without that something in the rest of the surrounding code changed.
I actually just compared the codes in SVN (VCLTee.Series.pas), it looks like the Clear procedure wasn't present in these earlier code versions?

Re: Crash in TFastLineSeries.Clear

Posted: Mon Mar 30, 2020 6:18 am
by yeray
Hello,

I see the TFastLineSeries.Clear method was introduced in v2019.28, to fix #2237. However, since I can't reproduce the problem I can't be sure if that is causing the issue you are observing.
Since you own the sources, may I ask you to try and see if removing that method solves the problem for you? Or even better, you could set the "Source\VCL" path in your Library path and debug the sources to see what is exactly crashing.

Re: Crash in TFastLineSeries.Clear

Posted: Mon Mar 30, 2020 8:35 am
by 16585377
Hi Yeray,

I debugged this already, it seems the clear gets still executed when everything is already destroyed.

Code: Select all

procedure TFastLineSeries.Clear;
begin
  inherited;
  if (ParentChart <> nil) then
    With ParentChart,Canvas do
    begin
        OldX := GetVertAxis.PosAxis; //LeftAxis.PosAxis;
        OldY := GetHorizAxis.PosAxis; //BottomAxis.PosAxis;
        if View3D then MoveTo3D(OldX,OldY,MiddleZ)
                  else MoveTo(OldX,OldY);
    end;
end;
The Crash then happens on line: 11699 => else MoveTo(OldX,OldY);
ParentChart is still <> nil interstingly

When in the code where the TFastLineSeries is filled:

Code: Select all

 if Length(ProfilePoints) > 0 then
  begin
    tmpLineSeries := TFastLineSeries.Create(ParentChart);
    // tmpLineSeries.ParentChart := ParentChart;
    tmpLineSeries.BeginUpdate;
    try
      tmpLineSeries.Color := SeriesColor;
      tmpLineSeries.Title := SeriesTitle;
      tmpLineSeries.LinePen.Width := SeriesLineWidth;
      for i := 0 to High(ProfilePoints) do
        tmpLineSeries.AddXY(ProfilePoints[i].X, ProfilePoints[i].Y);
    finally
      tmpLineSeries.EndUpdate;
      tmpLineSeries.Active := True;
    end;
  end;
I Don't assign "tmpLineSeries.ParentChart" I also can prevent the crash.
Not that the TChart instance is on a Frame that is put on a DockPanel and the DockPanel is on a MDI Childform

Re: Crash in TFastLineSeries.Clear

Posted: Mon Mar 30, 2020 6:05 pm
by 16585377
I had another look with the debugger in "procedure TFastLineSeries.Clear", so ParentChart is Assigned fine in that situation but
ParentChart.Canvas is NIL. So obviously that case needs to be checked too in that code like:

Code: Select all

 if (ParentChart <> nil) and (ParentChart.Canvas <> nil) then
    With ParentChart,Canvas do
not sure how that can happen though

Re: Crash in TFastLineSeries.Clear

Posted: Tue Mar 31, 2020 4:36 am
by yeray
Hello,

I was going to apply your suggestion and found it was already in our main codebase (so it will be included in the next maintenance release). That could explain why I wasn't able to reproduce the problem.
Then I found it was actually a fix proposed by another customer here.
I'm sorry for the time you lost with this.