首页 文章

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

提问于
浏览
5

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

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

    $DB::single=1;
    

    然后跑

    PERL5OPT='-dt'  perl yourscript.pl
    

    并击中

    c[enter]
    

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

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

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

  • 2

    在perl5搬运工邮件列表上的This thread似乎表明它被perl grab 了 .

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

  • 1

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

  • 1

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

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

  • 2

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

相关问题