1

Perl/TK を使用して GUI を作成し、状況によっては次のようなエラーでクラッシュする孤立した Perl プログラムを維持するという不幸な仕事があります。

*** glibc detected *** /usr/bin/perl: corrupted double-linked list: 0x0000000003daf500 ***

Perlプログラムにそのような動作を引き起こすバグが含まれている可能性は基本的にありますか、それともPerlインタープリターおよび/またはPerl/Tkのバグが原因であり、それらのツールの新しいバージョンを待つことが最善のアプローチであると安全に想定できますか?この問題を取り除くには?

編集:私の質問をより明確にするために:ウィジェットを2回破棄しようとする、または既に破棄されたウィジェットでメソッドを呼び出すなどのバグは、クリーンなエラーメッセージをもたらすか、または私が経験している問題を引き起こす可能性がありますか?

EDIT2: Perl のバージョンは 5.10.0/x86_64-linux-thread-multi

そして、このモジュールを使用します:

use Tie::Watch;
use Tk;
use Tk::Balloon;
use Tk::Compound;
use Tk::DialogBox;
use Tk::LabFrame;
use Tk::NoteBook;
use Tk::Pane;
use Tk::ROText;
use DBI;
use Data::Dumper;
use XML::Simple::DTDReader;
4

1 に答える 1

4

はい、可能ですが、この場合は可能性が低いです。

Perl (さらに言えば、任意のプログラミング言語) でプログラム メモリに直接アクセス (および変更) する方法は複数あります。これには拡張機能 (Win32::Process::Memory for Windows) がありますが、Linux では /proc/ pid /map (ランダム アクセス ファイルにマップされたプロセス メモリ) を開いて操作するのが最も簡単な方法です。

だから、間違いなく可能です。

ただし、Perl プログラムがこれらのトリックを使用して自身のメモリを直接操作している可能性はほとんどありません。ご想像のとおり、最も可能性の高い原因は、使用されているライブラリの 1 つです (この場合は Tk)。

Devel::Traceモジュールを使用して、プログラムがクラッシュする直前に何をしようとしているのかを確認することができます。

特定の行で常にクラッシュしていることがわかった場合は、その動作を変更して、基礎となるライブラリでバグが発生しないようにすることができます。ただし、それはちょっとした当たり外れがあります。

誰かが Perl/Tk のこの種のバグの知識を持っていれば、それは役に立ちます。あなたのプログラムは、Tk 以外の C ライブラリ (例えば、「純粋な perl」ライブラリではない) を使用する他のライブラリを使用していますか?

于 2012-09-07T06:49:22.850 に答える