【问题标题】:*** glibc detected *** perl: double free or corruption (!prev): 0x0c2b7138 ****** 检测到 glibc *** perl: 双重释放或损坏 (!prev): 0x0c2b7138 ***
【发布时间】:2010-10-27 07:32:40
【问题描述】:

在运行 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(克隆+0x5e)[0xb7e19e5e]

我的操作系统是 Ubuntu 8.04,Perl 版本是 5.8.8

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

感谢您的支持。

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

【问题讨论】:

    标签: perl debugging glibc


    【解决方案1】:

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

    $DB::single=1;
    

    然后运行

    PERL5OPT='-dt'  perl yourscript.pl 
    

    然后点击

    c[输入]

    重复直到问题再次出现。 (注意它是否在失败之前停止在您的手动断点处)。

    然后迭代地向前/向后移动手动断点,直到在终止点之前 (您也可以使用一堆打印命令找到死亡点),然后尝试从那里开始工作,可能带有崩溃前的自省。

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

    【讨论】:

    • 陷入线程让我很头疼.. 感谢您提供此信息。 :) 这就是我如何真正找出问题所在。只是没有卷土重来并标记您的解决方案。
    【解决方案2】:

    perl5 搬运工邮件列表上的This thread 似乎表明这是 5.8.8 和线程的已知问题。我认为您的问题可能是由于 perl 未捕获的代码问题。

    如果可以,我建议将代码精简为一个最小示例。然后,您应该能够尝试修复代码问题。

    【讨论】:

    • 剥离代码是一项艰巨的任务。我想把它作为最后的手段。我们有任何 perl 线程的可视化工具吗?还是我野心太大???
    • delta.tigris.org 是创建最小可重现测试用例的好工具。在适当的机械帮助下,这不应该是一项艰巨的任务:)
    • 按照 newt 所指出的类似线程,发现这是一个已知问题,将在未来的版本中介绍。我用一个备用黑客替换了我怀疑问题所在的部分.. 效果很好.. 感谢您的指点...
    【解决方案3】:

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

    【讨论】:

    • 我正在使用安装了 ubuntu 的 perl。我相信默认安装的 perl 应该与 glibc 版本兼容。另外,我在 RHEL5 上也遇到过同样的问题。所以这两个系统应该不会有版本冲突。
    【解决方案4】:

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

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

    【讨论】:

    • 我正在使用 perl 5.8.8 ...我可以升级到 5.8.8 但是我正在使用的产品仅在 5.8.8 上受支持。是否有任何其他工具可以连接到调试器并监视操作并可以准确指出脚本在什么时候中断。
    • 就个人而言,我会尝试升级到 5.8.9。它应该是一个维护版本,因此不太可能破坏您的应用程序。 Perl 5.8.9 的发布公告确实提到了对线程安全问题的修复。这可能正是您的问题。 search.cpan.org/~nwclark/perl-5.8.9/pod/… 理论上,您可以将调试器附加到 Perl 并尝试更多地了解问题所在。这将是非常雄心勃勃的。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-20
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多