运行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的决定。我只是维护代码。答案 0 :(得分:2)
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'模块。