2009-01-14 81 views
2

什么是我将运行一个Perl脚本收到此错误最常见的原因:什么会导致Perl转储核心?

Memory fault(coredump) 

我运行两个SQL命令事先只商店〜各有6场1500行。 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获取命令

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语句,然后循环进入行动..我只是不想浪费空间。

回答

2

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

4

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

+0

如果我扔了一个事实,我有另一个脚本运行良好,并给我的错误是一个产卵测试脚本运行良好..一切都是一样的,除了我选择较少的项目在第二个sql语句中? – CheeseConQueso 2009-01-14 21:28:25

+0

你最近怎么样?叉或线程? – 2009-01-14 22:05:50

+0

我甚至不知道这意味着什么。我只是制作了实际文件的副本,并将其保存为facultytest.pl,而不是faculty.pl – CheeseConQueso 2009-01-15 15:47:45

2

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

4

您可以将有问题的脚本简化为显示相同错误的简短内容吗?脚本中的哪个位置会转储核心?

我的第一个嫌疑人是你正在使用的一个模块有一个XS组件没有很好地演奏。找出脚本在哪里爆炸,然后开始调查那里的零件。切割零件,直到你能想出最小的脚本来重现问题。