Помогите понять ошибку malloc из скрипта Perl-CGI? или Где находится malloc_error_break - PullRequest
2 голосов
/ 25 июня 2011

Это ошибка:

[Fri Jun 24 18:26:44 2011] [error] [client ::1] perl(3116) malloc: *** error for object 0x10082b808: incorrect checksum for freed object - object was probably modified after being freed.
[Fri Jun 24 18:26:44 2011] [error] [client ::1] *** set a breakpoint in malloc_error_break to debug
[Fri Jun 24 18:26:44 2011] [error] [client ::1] Premature end of script headers: adjsearch.cgi

Во-первых, я мог бы попытаться отладить, если бы знал, как применить совет второй строки из error_log.http://lists.apple.com/archives/Xcode-users/2008/Apr/msg00160.html говорит об этом в XCode, но я не использую XCode ...

Я понятия не имею, что это значит, и хотел бы помочь некоторым понять следующее объяснение, и как я могуиспользуйте эту информацию, чтобы помочь отладке.:

И после некоторого поиска я нашел это:

Ошибка означает именно то, что она говорит: вы, вероятно, изменили память после ее освобождения.Ваш фрагмент кода не показывает, например, где было размещено itr_coord, но код, в котором вы видите это сообщение об ошибке, является просто точкой, в которой какая-то операция с памятью (возможно, выделение) заставила отладчик памяти проверить контрольные суммы освобожденных объектов.Это на самом деле не говорит вам о том, где на самом деле произошла ошибка записи в освобожденную память

Если вы хотите более конкретную информацию, дайте мне знать.Большое спасибо!

ОБНОВЛЕНИЕ: очень странно, вот проблема (не решение):

elsif ($category_id eq "allverb")
     {
      if (($lines[$l] =~ /\b$verbform\b/i))
        {
        next unless ($lines[$l] =~ /\w+\((\w+)\-\d+\,\s(\w+)\-\d+\)/);
        $arg1 = $1;
        $arg2 = $2;
         #If the searchword is the 1st argument
            $goodmatch = 1;

         }
      }

Нет ошибки, если я сделаю что-то подобное (примечание добавлено, если утверждение):

elsif ($category_id eq "allverb")
   {
   if (($lines[$l] =~ /\b$verbform\b/i))
      {
       next unless ($lines[$l] =~ /\w+\((\w+)\-\d+\,\s(\w+)\-\d+\)/);
       $arg1 = $1;
       $arg2 = $2;

        if ($arg1 eq $verbform)
            {
              $goodmatch = 1;
            }
       }
   }

но опять же, если я поставлю if ($arg1 eq $verbform or $arg2 eq $verbform) или просто отделю их от операторов if ..?

Может быть, это ошибка памяти .... мой код написан довольно неэффективнопрямо сейчас.Или ошибка apache ... Каждый раз, когда я ограничиваю условие больше (добавьте больше в оператор if, чтобы меньше проходило), это работает!Как мне обойти это?

ИСПОЛЬЗОВАННЫЕ ВЕРСИИ:

Mac OS X 10.6.7 ... Perl версия 5.10.0 ... Apache2?Тот, который поставляется с Mac ...

1 Ответ

0 голосов
/ 19 августа 2011

Я не могу ответить на ваш вопрос напрямую, но могу сказать, что ошибки malloc в Perl не распространены, особенно в том коде, который вы здесь представляете.

Вы сами компилировали бинарный файл Perl или используете тот, который поставляется с системой?Если вы сделали это сами, попробуйте еще раз с Configure -de.Кроме того, мне кажется, что я могу вспомнить проблему с GCC и XCode, которая может повлиять на вас, но Google знает все.

Это может быть также плохая физическая память, хотя, если это происходит неоднократно в одном и том же месте, эта причина маловероятна.

Использует ли этот скрипт много памяти (сотни или тысячи мегабайт?).

Но я думаю, что виновником могут быть обратные ссылки в регулярных выражениях.Попробуйте код без назначения обратных ссылок:

$lines[$l] =~ /\w+\((\w+)\-\d+\,\s(\w+)\-\d+\)/;
if (defined $1 && $1 eq $verbform) {
   $goodmatch = 1;
}

Также попробуйте этот код на другом компьютере с Perl.Это, вероятно, не произойдет там.

Удачи и надеюсь, что это поможет некоторым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...