*** Обнаружен glibc *** perl: двойное освобождение или повреждение (! prev): 0x0c2b7138 *** - PullRequest
5 голосов
/ 19 мая 2009

При запуске Perl-программы я обнаружил следующую ошибку

*** glibc detected *** perl: double free or corruption (!prev): 0x0c2b7138 ***
/lib/tls/i686/cmov/libc.so.6[0xb7daea85]
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7db24f0]
perl(Perl_pregfree+0x3e)[0x80a004e]
perl(perl_destruct+0xcf1)[0x806b711]
/usr/local/lib/perl/5.8.8/auto/threads/threads.so[0xb79d2dfb]
/usr/local/lib/perl/5.8.8/auto/threads/threads.so[0xb79d2f9b]
/usr/local/lib/perl/5.8.8/auto/threads/threads.so[0xb79d5fbb]
/lib/tls/i686/cmov/libpthread.so.0[0xb7e974fb]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0xb7e19e5e]

Моя ОС - Ubuntu 8.04, версия Perl - 5.8.8

Мои сценарии содержат потоки ... Я не могу поделиться кодом, но хотел бы знать, имел ли кто-либо опыт работы с ошибками такого типа и как вы их решили / подошли / проанализировали. Существуют ли какие-либо инструменты / журналы, на которые я мог бы ссылаться в дополнение к работе над такого рода проблемами.

Спасибо за вашу поддержку.

П.С .: Я знаю, что темы не являются идеальными друзьями для кого-либо. Однако я не контролирую решение использования Perl. Я просто поддерживаю код.

Ответы [ 5 ]

2 голосов
/ 19 мая 2009

откройте ваш код и вставьте в него где-то до того, как возникнет проблема:

$DB::single=1;

Затем запустите

PERL5OPT='-dt'  perl yourscript.pl 

и нажмите

c[enter]

несколько раз, пока проблема не повторится. (Сохраняя информацию о том, останавливается ли он на вашей ручной точке останова или нет до сбоя).

Затем итеративно перемещайте ручную точку останова вперед / назад до тех пор, пока она не будет всего за до вашей точки завершения (вы также можете найти точку смерти с помощью набора команд печати), а затем попробуйте поработать оттуда возможно с самоанализом перед сбоем.

Это (надеюсь) поможет вам создать контрольный пример, в котором обнаружена проблема.

2 голосов
/ 19 мая 2009

Этот поток в списке рассылки perl5 porters, кажется, указывает на то, что это известная проблема с 5.8.8 и потоками. Я думаю, что ваша проблема, вероятно, из-за проблемы с кодом, которая не перехватывается perl.

Если вы можете, я бы предложил сократить код до минимального примера. После этого вы сможете попытаться исправить проблему с кодом.

1 голос
/ 19 мая 2009

Это похоже на внутреннюю ошибку Perl. «Двойное освобождение или повреждение» означает, что память освобождается дважды или повреждена. Perl управляет памятью для вас, поэтому этого не должно происходить, если Perl работает правильно.

Есть ли более новая версия Perl, до которой вы можете перейти?

1 голос
/ 19 мая 2009

Наиболее вероятная причина - несовместимая версия glibc. Вам нужно запустить Perl с версией glibc, с которой он был скомпилирован

0 голосов
/ 19 мая 2009

Попробуйте обновить модули «threads» и «threads :: shared» из CPAN.

...