***glibc检测到***perl:双重释放或损坏(!prev):0x0c2b7138***

***glibc检测到***perl:双重释放或损坏(!prev):0x0c2b7138***,perl,debugging,glibc,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+0x

在运行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] ***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

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

谢谢你的支持


我知道线程不是任何人的理想朋友。然而,我不能控制使用perl的决定。我只是在维护代码。

最可能的原因是glibc版本不兼容。您需要使用编译它的glibc版本运行Perl,这看起来像是Perl内部的错误。“双重释放或损坏”指内存被释放两次或损坏。Perl为您管理内存,因此如果Perl工作正常,这种情况永远不会发生

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

在perl5 porters邮件列表上,似乎表明这是5.8.8和线程的一个已知问题。我认为您的问题可能是由于perl没有发现的代码问题


如果可以的话,我建议将代码剥离到一个最小的示例中。然后,您应该能够尝试修复代码问题

打开代码并将其放在问题发生之前的某个位置:

$DB::single=1;
然后跑

PERL5OPT='-dt'  perl yourscript.pl 
击中

c[enter] c[输入] 不断重复,直到问题再次出现。(注意在失败之前它是否在手动断点处停止)

然后迭代地向前/向后移动手动断点,直到它刚好在终止点之前(您也可以使用一系列打印命令找到死亡点),然后尝试从那里开始工作,可能是通过崩溃前的内省


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

尝试从CPAN更新“线程”和“线程::共享”模块。

我正在使用随ubuntu一起安装的perl。我认为默认安装的perl应该与glibc版本兼容。另外,我在RHEL5上也遇到过同样的问题。所以这两个系统可能会有版本冲突。。。我可以升级到5.8.8,但是我正在使用的产品仅在5.8.8上受支持。是否有其他工具可以连接到调试器并监视操作,并且可以精确地指出脚本的断点。就我个人而言,我会尝试升级到5.8.9。它应该是一个维护版本,因此不太可能破坏您的应用程序。Perl 5.8.9的发布公告确实提到了一个线程安全问题的修复。这可能正是你的问题。理论上,您可以将调试器附加到Perl,并尝试进一步了解问题所在。这将是一项雄心勃勃的任务。剥离代码是一项艰巨的任务。我想把它作为最后的手段。我们有perl线程的可视化工具吗。还是我太野心勃勃了???是创建最小可重复性测试用例的好工具。在适当的机械帮助下,这不应该是一项繁重的任务:)遵循纽特指出的类似线程,发现这是一个已知的问题,将在未来的版本中讨论。我用另一个黑客替换了我怀疑问题所在的部分。。很好用。。谢谢你的指南针…刹车进入线程让我很头疼。。感谢您提供此信息。:)这就是我如何真正找出问题所在的方法。只是没有回来标记你的解决方案。