TScrollBox或TChart内存泄漏(FMX,C ++)

时间:2019-09-04 02:11:13

标签: firemonkey c++builder

我一直试图在iOS上发现内存泄漏,我99%的错误是在TScrollBox或TChart中。导致崩溃的动作很简单,就是在TChart上来回滚动。该应用程序在Win32中表现良好,并且内存使用情况稳定。

iOS上的崩溃原因是 EXC_RESOURCE-> myappname [5548]超出了内存限制:每个Xcode Console的ActiveHard 1400MB(严重)

要排除我的意大利面条式代码作为罪魁祸首,我创建了一个简单的项目来重现该错误,并且它也崩溃了。以下是Xcode Console输出中的片段。我收到了很多断言,然后收到了Received memory警告,然后iOS内核杀死了我的应用程序(Project1)。

default 20:28:26.180333 -0500 assertiond [Project1:7693] Activate assertion: <BKProcessAssertion: 0x12b0102c0; "com.apple.UIKit.KeyboardManagement.message" (finishTask:180s); id:…8EA7F5E94DD5> default 20:28:26.180542 -0500 assertiond [Project1:7693] Setting jetsam priority to 10 [0x10108] default 20:28:26.182151 -0500 assertiond [Project1:7693] Deactivate assertion: <BKProcessAssertion: 0x12b0102c0; "com.apple.UIKit.KeyboardManagement.message" (finishTask:180s); id:…8EA7F5E94DD5> default 20:28:26.182312 -0500 assertiond [Project1:7693] Setting jetsam priority to 10 [0x10100] default 20:28:26.183307 -0500 assertiond [Project1:7693] Remove assertion: <BKProcessAssertion: 0x12b0102c0; "com.apple.UIKit.KeyboardManagement.message" (finishTask:180s); id:…8EA7F5E94DD5> default 20:28:32.609723 -0500 Project1 Received memory warning.

然后不久,我看到以下控制台消息:

默认20:28:45.881914 -0500内核 EXC_RESOURCE-> Project1 [7693]超出了内存限制:ActiveHard 1400 MB(致命)。

我的崩溃测试应用程序是一个使用C ++ Builder 10.3.2构建的简单Firemonkey应用程序。

A)在表格(Panel1)上放置一个TPanel。

B)将TScrollBox放在Panel1(ScrollBox1)上。将其对齐方式设置为“内容”。

C)在ScrollBox1(Layout1)上放置一个TLayout。将其对齐设置为无。将其宽度设置为2100。

D)在Layout1上放置一个TChart。将其高度设置为200,宽度为7300。将其对齐设置为无。

E)在Form1中添加一个TToolBar并在其上放置一个TButton。

F)然后将此代码放入TButton的click事件中:

Form1->Layout1->Position->X = 0;
Form1->ChartTest->Position->Y = 0;
Form1->ChartTest->Position->X = 0;

TLineSeries *series1 = new TLineSeries(Form1);
TLineSeries *series2 = new TLineSeries(Form1);
TLineSeries *series3 = new TLineSeries(Form1);
TLineSeries *series4 = new TLineSeries(Form1);

series1->Color = claBlue; 
series2->Color = claRed;
series3->Color = claBlueviolet;
series4->Color = claAqua;

double x, y;
for (int i = 0; i < 1000; i++) {
 x = i;
 y = Random(5000);
 series1->AddXY(x,y);
 y = Random(5000);
 series2->AddXY(x,y);
 y = Random(5000);
 series3->AddXY(x,y);
 y = Random(5000);
 series4->AddXY(x,y);
}

Form1->ChartTest->AddSeries(series1);
Form1->ChartTest->AddSeries(series2);
Form1->ChartTest->AddSeries(series3);
Form1->ChartTest->AddSeries(series4);

G)现在,在将iOS设备连接到Mac并打开Xcode Console的情况下,如果您将控制台输出命名为“ Project1”,则对其进行过滤。然后运行该应用程序,然后向后/向前和/或向上/向下滚动(如果要来回移动,也可以更改方向)。您将看到大量的断言。最终(这种骚扰大约需要2-3分钟才能使其崩溃),它将耗尽足以使其崩溃的内存。

我认为内存泄漏很可能是在TeeChart中出现的,也许是在TScrollBox中?

谢谢, 鲁斯

1 个答案:

答案 0 :(得分:0)

内存泄漏在TChart中。我创建了另一个没有滚动框的简单项目,并添加了一个计时器,该计时器每0.1秒上下移动TChart。 2-3分钟后,在单击Button1开始操作后,它在iOS上由于没有用户输入而导致内存错误而崩溃。发生这种崩溃的原因是没有滚动或任何交互-只是图表摇摆不定。

在Win32上测试应用程序工作正常-内存稳定且没有增长。

因此,我希望在创建图表方面有一些明显的不足之处-由于Steema图表非常灵活,我真的不想放弃该船。我也发布到了Steema论坛,但是由于数量太少,我也在这里发布。

有什么想法吗?注意我还使用了2019年5月30日发布的TeeChart Standard VCL / FMX的许可版本-Build 2019.27.190530。我还运行了一个测试用例,其中图表是固定的(没有用户输入,也没有计时器事件移动图表)并且没有崩溃。它与以某种方式重新调整图表有关。我尝试了Form1->ChartTest->AutoRepaint = false;,但没有任何效果。压缩的测试项目在这里:Project1a

谢谢, 鲁斯

更新:TeeChart Standard版本2019.27.190530中存在内存泄漏错误,但Rad Studio 10.3附带的免费/精简版中没有不存在。截至目前为2(版本v2016.17.160129)。