Что заставит Perl выгружать ядро? - PullRequest
2 голосов
/ 15 января 2009

Каковы наиболее распространенные причины, по которым я получаю эту ошибку при запуске сценария 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 ]

4 голосов
/ 15 января 2009

Можете ли вы уменьшить проблемный скрипт до чего-то короткого, что показывает ту же ошибку? Где в скрипте дамп ядра?

Моим первым подозрением будет то, что один из модулей, который вы используете, имеет компонент XS, который проигрывается некорректно. Узнайте, где сценарий взрывается, затем начните исследовать части вокруг. Продолжайте вырезать детали, пока не найдете самый маленький сценарий, который воспроизводит проблему.

4 голосов
/ 15 января 2009

Вы исправляете ошибку в интерпретаторе Perl или одном из его модулей Си. Если ваш бинарный Perl не имеет отладочных символов, скомпилируйте версию, которая делает это, и сделайте дамп ядра. Загрузите дамп ядра в gdb и выполните обратную трассировку. Найдите ошибку, посмотрите, есть ли она в последней версии, а если нет, то отправьте патч, который ее исправляет.

2 голосов
/ 03 февраля 2009

Перед изменением кода вы вызывали GetCharValue после проверки, было ли значение $ i тем, что вы хотели. После изменения вы звоните, даже если это не 1,2,10,12. Возможно ли, что значения $ i, отличные от этих 4, вызывают проблему?

2 голосов
/ 15 января 2009

Я видел похожие события, когда драйвер DBD компилируется для другой версии разделяемой библиотеки, чем в настоящее время в системе. (Например, в случае наличия MySQL4, а затем обновления до MySQL5 без перекомпиляции DBD)

...