什么会导致Perl转储核心?

时间:2009-01-14 21:03:02

标签: perl memory scripting coredump

我在运行Perl脚本时遇到此错误的最常见原因是什么:

Memory fault(coredump)

我预先运行两个SQL命令,只存储~1500行,每行包含6个字段。 SQL在脚本中工作得很好,所以我不认为我从中得到了错误。我的一半代码在它需要炸弹之前运行并且给我错误。

那么这个错误的最常见原因是什么?我的理由是什么?

编辑 - 继承了有效的代码

my $i;
$i = 0;    
while ($DBS->SQLFetch() == *PLibdata::RET_OK)
    {
        while ($i != $colnamelen)
        {
            if ($i == 1)
            {
                $rowfetch = $DBS->{Row}->GetCharValue($colname[$i]);
                $rowfetch =~ s/(?=..$)/:/;
                printline($rowfetch);
                $i++;       
            }
            if ($i == 2)
            {
                $rowfetch = $DBS->{Row}->GetCharValue($colname[$i]);
                $rowfetch =~ s/(?=..$)/:/;
                printline($rowfetch);
                $i++;       
            }
            if ($i == 10)
            {
                $rowfetch = $DBS->{Row}->GetCharValue("meetdays");
                $rowfetch =~ s/-//gi;
                printline($rowfetch);
                $i++;
            }
            if ($i == 12)
            {
                $rowfetch = $DBS->{Row}->GetCharValue("fullname");
                my ($lname, $fname) = split /,\s*/, $rowfetch;
                $rowfetch = $fname;
                printline($rowfetch);
                $rowfetch = $lname;
                printline($rowfetch);
                $i=$i+2;
            }
            else
            {
                $rowfetch = $DBS->{Row}->GetCharValue($colname[$i]);
                printline($rowfetch);
                $i++;
            }
        }
        $i=0;   
        printf $fh "\n";
    }

继承不起作用的代码 - 所做的一切都是优化sql fetch命令

my $i;
$i = 0;      
while ($DBS->SQLFetch() == *PLibdata::RET_OK)
    {
        while ($i != $colnamelen)
        {
                $rowfetch = $DBS->{Row}->GetCharValue($colname[$i]);
            if ($i == 1)
            {
                $rowfetch =~ s/(?=..$)/:/;
                printline($rowfetch);
                $i++;       
            }
            if ($i == 2)
            {
                $rowfetch =~ s/(?=..$)/:/;
                printline($rowfetch);
                $i++;       
            }
            if ($i == 10)
            {
                $rowfetch =~ s/-//gi;
                printline($rowfetch);
                $i++;
            }
            if ($i == 12)
            {
                my ($lname, $fname) = split /,\s*/, $rowfetch;
                $rowfetch = $fname;
                printline($rowfetch);
                $rowfetch = $lname;
                printline($rowfetch);
                $i=$i+2;
            }
            else
            {
                printline($rowfetch);
                $i++;
            }
        }
        $i=0;   
        printf $fh "\n";
    }

哦,顺便说一句,在此循环开始行动之前,有一个正常运行的SQL语句。我只是不想浪费空间。

4 个答案:

答案 0 :(得分:4)

你在Perl解释器或其中一个C模块中发现了一个错误。如果您的Perl二进制文件没有调试符号,请编译一个版本并进行核心转储。将核心转储装载到gdb中并执行后退跟踪。找到错误,查看它是否在最新版本中,如果不是,则提交修补程序修补程序。

答案 1 :(得分:4)

您是否可以将有问题的脚本缩减为显示相同错误的短片?脚本在哪里转储核心?

我的第一个嫌疑人是你正在使用的模块之一有一个不能很好地播放的XS组件。找出剧本爆炸的地方,然后开始调查那里的部分。继续切割零件,直到你能够提出最小的脚本来重现问题。

答案 2 :(得分:2)

当针对共享库的不同版本编译DBD驱动程序时,我看到类似的事件。 (例如有MySQL4的情况,然后升级到MySQL5而不重新编译DBD)

答案 3 :(得分:2)

在代码更改之前,在检查$ i是否为您想要的值之后,您调用了GetCharValue。更改后,即使它不是1,2,10,12,也可以调用它。除了那些4之外的$ i的值是否可能导致问题?