*** Обнаружен glibc *** perl: двойное освобождение или повреждение (!prev): 0x0c2b7138 ***

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

*** Обнаружен glibc *** perl: двойное освобождение или повреждение (!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

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

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

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

5 ответов

Решение

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

$DB::single=1;

Тогда беги

PERL5OPT='-dt'  perl yourscript.pl 

и ударил

центр]

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам