Perl Tk GUI应用内存超4GB后崩溃问题求助
Perl Tk GUI应用Windows下内存超4GB崩溃问题分析与复现
问题描述
开发的Perl Tk GUI应用在内存占用超过4GB时偶尔崩溃,但同逻辑的控制台程序无异常。崩溃时多数情况下输出Free to wrong pool错误,偶有直接崩溃无报错的情况。该问题仅出现在Windows系统,CentOS 7 Linux环境下正常运行。
环境信息
- 操作系统:Microsoft Windows [Version 10.0.19044.2006]
- Perl版本:v5.30.3
- Tk版本:804.036(CPAN最新版)
崩溃现象
- 典型报错:
Free to wrong pool 678ea0 not e228dd0 at .\common\GUI_TESTS\test_memory_hog_gui.pl line 41.
- 偶发无报错直接崩溃;
- 该错误通常与多线程相关,但本应用未使用多线程。
64位环境验证
已确认所有组件为64位:
perl -V:ivsize # ivsize='8'; perl -V:ptrsize # ptrsize='8'; perl -V:archname # archname='MSWin32-x64-multi-thread';
复现代码
以下简化代码通过循环克隆数据结构使内存突破4GB,可稳定复现崩溃:
use strict; use warnings; use Tk; use Tk::LabFrame; use Clone; my $MAIN_WINDOW = MainWindow->new; $MAIN_WINDOW->minsize(400, 400); my @dataStructureClones = (); my $textBox; my $button_frame = $MAIN_WINDOW->LabFrame(-label => "Test", -relief => 'groove', -borderwidth => 2)->pack(); $button_frame->Button( -text => 'Run Crashing Operation', -command => sub { my $dataStructureThatCrashes = { NETLIST_INFO => { EXTRA_PROPERTIES => { C_SIGNAL => {}, NET => {}, }, NET_LIST => [ # 注释此行后程序可正常运行至内存超4GB { NL_INDEX => 0, } ] }, }; my $lastUpdate = time(); push @dataStructureClones, $dataStructureThatCrashes; for (1 .. 5000000) { if (time() - $lastUpdate > 1) { # 注释此段UI更新代码后,克隆循环可完成,但15秒后仍会崩溃 $textBox->insert("end", "Cloning hash ($_)\n"); $MAIN_WINDOW->update(); $lastUpdate = time(); } push @dataStructureClones, Clone::clone($dataStructureThatCrashes); } } )->grid(-row => 0, -column => 0); $textBox = $MAIN_WINDOW->Scrolled( 'Text', -relief => 'groove', -background => 'light grey', -foreground => 'black', -wrap => 'char', -scrollbars => 'osoe', -width => 110, -height => 24, )->pack(-side => 'top', -fill => 'both', -expand => 1); MainLoop;
关键观察点
- 注释代码中
NET_LIST数组内的哈希元素(第28行)后,程序可正常运行至内存超过4GB; - 注释UI更新代码段(第38-40行)后,克隆循环能完成,但15秒后仍会崩溃,报错:
Free to wrong pool 1008ea0 not fcedf7a8 at C:/Strawberry/perl/site/lib/Tk.pm line 424.
内容的提问来源于stack exchange,提问作者Erik Angerstig
相关产品推荐
相关产品推荐

