2

运行 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";
    }

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

4

4 回答 4

4

您正在处理 Perl 解释器或其 C 模块之一中的错误。如果您的 Perl 二进制文件没有调试符号,请编译一个有调试符号的版本并进行核心转储。将核心转储加载到 gdb 并进行回溯。找到错误,看看它是否在最新版本中,如果不是,则提交修复它的补丁。

于 2009-01-14T21:06:03.947 回答
4

您能否将有问题的脚本简化为显示相同错误的简短内容?它在脚本的哪里转储核心?

我的第一个怀疑是您正在使用的模块之一有一个不能很好玩的 XS 组件。找出脚本爆炸的地方,然后开始调查那里的部分。继续删减部分,直到你能想出重现问题的最小脚本。

于 2009-01-14T22:37:26.257 回答
2

当 DBD 驱动程序针对与当前系统上不同版本的共享库进行编译时,我看到了类似的事件。(比如有 MySQL4,然后升级到 MySQL5 而不重新编译 DBD)

于 2009-01-14T21:06:05.287 回答
2

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

于 2009-02-03T20:56:25.880 回答