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

TScrollBox or TChart memory leak (FMX, C++)

我一直试图在 iOS 上查找内存泄漏,我 99% 认为它在 TScrollBox 或 TChart 中。导致崩溃的操作很简单,就是在 TChart 上来回滚动。该应用程序在 Win32 中运行良好,内存使用稳定。

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

为了排除我的意大利面条代码作为罪魁祸首,我创建了一个简单的项目来重现错误,但它也崩溃了。以下是 Xcode 控制台输出的片段。我得到大量断言,然后收到内存警告,然后 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(严重)。

我的碰撞测试应用程序是一个简单的 Firemonkey 应用程序,它是在 C++ Builder 10.3.2 中构建的。

A) 在窗体 (Panel1) 上放置一个 TPanel。

B) 在Panel1(ScrollBox1)上放一个TScrollBox。将其对齐设置为内容。

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

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

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

F) 然后把这段代码放在TButton的点击事件中:

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 控制台,如果是,则在“Project1”上过滤控制台输出你给它起的名字。然后 运行 应用程序并滚动 backwards/forwards and/or up/down(如果你想来回移动也可以改变方向)。你会看到大量的断言。最终(大约需要 2-3 分钟的骚扰才能使其崩溃)它会消耗足够的内存导致崩溃。

我认为内存泄漏最有可能在 TeeChart 中,也许在 TScrollBox 中?

谢谢, 拉斯

内存泄漏在 TChart。我创建了另一个没有滚动框的简单项目,并添加了一个计时器,每 0.1 秒上下移动一次 TChart。 2-3 分钟后,它因 iOS 上的内存错误而崩溃,在单击 Button1 启动后没有用户输入。此崩溃发生时没有滚动或任何交互 - 只是图表摆动。

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

所以,我希望在我创建图表的过程中有一些明显的缺陷——我真的不想放弃,因为 Steema 图表非常灵活。我也在 Steema 论坛上发帖,但由于发帖量低,我也在这里发帖。

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

谢谢, 拉斯

更新:TeeChart Standard 版本 2019.27.190530 中存在内存泄漏错误,但 不存在 free/lite 截至目前 Rad Studio 10.3.2 附带的版本(版本 v2016.17.160129)。