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)。
我一直试图在 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)。