【问题标题】:What would cause Perl to dump core?什么会导致 Perl 转储内核?
【发布时间】:2010-10-01 11:23:09
【问题描述】:

运行 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 语句。我只是不想浪费空间。

【问题讨论】:

    标签: perl memory scripting coredump


    【解决方案1】:

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

    【讨论】:

    • 如果我承认我有另一个运行良好的脚本,而给我错误的是一个运行良好的产卵测试脚本......一切都是一样的除了我在第二条 sql 语句中选择较少的项目?
    • 我什至不知道那是什么意思。我只是复制了实际文件并将其保存为facultytest.pl 而不是faculty.pl
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的建议。我已经尝试过了,它如何为我提供无用的核心转储非常可怕。它在充当 sql 命令的 rowfetch 的 while 语句之前转储。就在上面,而 stmt 是 printf $fh "\n";.. 在此之下没有任何作用.. n.e.另一个 printf stmt
      【解决方案4】:

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

      【讨论】:

      • $i 在第一个 while 循环开始之前被初始化并设置为 0.. 我应该包括那个.. 是的.. 每次嵌套的 while 循环运行并设置时,$i 都会增加 1在外部while循环中再次为0,以便嵌套可以为每个查询结果行再次运行'i'次
      • also ... colname 是一个包含字段名称的数组,当 $i 介于 0 和 14 之间时,$colname[$i] 永远不会为空
      • 其实$i如果不是1,2,10,12就加1,如果是1、10或12就加2,如果是2就加3。$colnamelen是怎么设置的?
      • 试试这个作为第二个while循环:while ($i
      • $colnamelen = @colname; - 它每次都增加 1,除非元素 12 将一个结果分成 2 个字段,然后将 i 增加 2
      猜你喜欢
      • 2021-11-19
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 2018-03-21
      • 2015-09-29
      • 1970-01-01
      相关资源
      最近更新 更多