5

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

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

谢谢您的支持。

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

4

5 回答 5

2

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

$DB::single=1;

然后运行

PERL5OPT='-dt'  perl yourscript.pl 

并击中

中央]

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

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

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

于 2009-05-19T17:25:04.567 回答
2

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

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

于 2009-05-19T13:24:09.657 回答
1

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

于 2009-05-19T12:34:32.813 回答
1

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

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

于 2009-05-19T12:36:42.390 回答
0

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

于 2009-05-19T19:55:54.307 回答