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(clone+0x5e)[0xb7e19e5e]

私のOSはUbuntu8.04、Perlバージョンは5.8.8です。

私のスクリプトにはスレッドが含まれています...コードを共有することはできませんが、このタイプのエラーの経験があるかどうか、およびどのように解決/アプローチ/分析したかを知りたいと思いました。この種の問題に取り組むために追加で参照できるツール/ログはありますか?

ご支援いただきありがとうございます。

PS:スレッドは誰にとっても理想的な友達ではないことを私は知っています。しかし、私はperlを使用する決定を管理していません。私はコードを維持しているだけです。

4

5 に答える 5

2

perl5ポーターのメーリングリストにあるこのスレッドは、5.8.8とスレッドの既知の問題であることを示しているようです。あなたの問題はおそらくperlによって捕らえられていないコードの問題が原因だと思います。

可能であれば、コードを最小限の例に分解することをお勧めします。その後、コードの問題の修正を試みることができるはずです。

于 2009-05-19T13:24:09.657 に答える
2

コードを開き、問題が発生する前のどこかに配置します。

$DB::single=1;

次に実行します

PERL5OPT='-dt'  perl yourscript.pl 

とヒット

中心]

問題が再発するまで繰り返します。(失敗する前に、手動ブレークポイントで停止するかどうかをメモしてください)。

次に、手動ブレークポイントを終了ポイントの直前まで繰り返し前後に移動し(一連の印刷コマンドで死のポイントを見つけることもできます)、そこから作業を試みます。クラッシュ前のイントロスペクションを使用することもできます。

これは(うまくいけば)問題を示すテストケースを生成するのに役立ちます。

于 2009-05-19T17:25:04.567 に答える
1

最も可能性の高い原因は、互換性のないバージョンのglibcです。コンパイルされたバージョンのglibcでPerlを実行する必要があります

于 2009-05-19T12:34:32.813 に答える
1

これはPerl内部のエラーのように見えます。「ダブルフリーまたは破損」とは、メモリが2回解放されるか、破損することを指します。Perlはあなたに代わってメモリを管理するので、Perlが正しく機能していれば、これは決して起こらないはずです。

アップグレードできるPerlの新しいバージョンはありますか?

于 2009-05-19T12:36:42.390 に答える
0

CPANから「threads」および「threads::shared」モジ​​ュールを更新してみてください。

于 2009-05-19T19:55:54.307 に答える