*** glibc检测到*** perl:双重免费或腐败(!prev):0x0c2b7138 ***

时间:2009-05-19 12:23:12

标签: perl debugging glibc

运行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

我的脚本包含线程...我无法共享代码,但想知道是否有人遇到过这种类型的错误,以及您是如何解决/接近/分析它的。是否有任何工具/日志可以参考此类问题。

感谢您的支持。

P.S:我知道线程不是任何人的理想朋友。但是我不控制使用perl的决定。我只是维护代码。

5 个答案:

答案 0 :(得分:2)

perl5搬运工邮件列表上的

This thread似乎表明它是5.8.8和线程的已知问题。我认为您的问题可能是由于perl未捕获的代码问题。

如果可以,我建议将代码拆除为最小的例子。然后,您应该能够尝试修复代码问题。

答案 1 :(得分:2)

打开你的代码并在问题发生之前将放在某处

$DB::single=1;

然后运行

PERL5OPT='-dt'  perl yourscript.pl 

并点击

c[enter]

反复出现,直到问题再次出现。 (记下在失败之前是否在手动断点处停止)。

然后迭代地向前/向后移动手动断点,直到你的终止点之前(你也可以通过一堆打印命令找到死点),然后从那里尝试工作,可能是预碰撞内省。

这将(希望)帮助您生成一个展示问题的测试用例。

答案 2 :(得分:1)

最可能的原因是glibc的版本不兼容。您需要使用与其编译的glibc版本运行Perl

答案 3 :(得分:1)

这看起来像是Perl内部的错误。 “双重免费或损坏”是指内存被释放两次或被破坏。 Perl为您管理内存,因此如果Perl工作正常,这种情况永远不会发生。

是否有更新版本的Perl可以升级到?

答案 4 :(得分:0)

尝试从CPAN更新'threads'和'threads :: shared'模块。