运行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 回答
打开你的代码并在问题发生之前将其放入某处:
然后跑
并击中
反复直到问题再次出现 . (记下在失败之前是否在手动断点处停止) .
然后迭代地向前/向后移动手动断点,直到你在终止点之前有它(你也可以用一堆打印命令找到死点),然后从那里尝试工作,可能还有预碰撞内省 .
这将(希望)帮助您生成一个展示问题的测试用例 .
在perl5搬运工邮件列表上的This thread似乎表明它被perl grab 了 .
如果可以,我建议将代码拆除为最小的例子 . 然后,您应该能够尝试修复代码问题 .
最可能的原因是glibc的版本不兼容 . 您需要使用与其编译的glibc版本运行Perl
这看起来像是Perl内部的错误 . “双重免费或损坏”是指内存被释放两次或被破坏 . Perl为您管理内存,因此如果Perl正常工作,这应该永远不会发生 .
是否有更新版本的Perl可以升级到?
尝试从CPAN更新'threads'和'threads :: shared'模块 .