2009-01-14 82 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組件沒有很好地演奏。找出腳本在哪裏爆炸,然後開始調查那裏的零件。切割零件,直到你能想出最小的腳本來重現問題。