2009-05-19 8 views
5

Während des Laufens ein Perl-Programm, das ich die folgende Fehler aufgetreten*** glibc erkannt *** perl: Doppel frei oder Korruption (i!): 0x0c2b7138 ***

 
*** 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] 

Mein OS ist Ubuntu 8.04, Perl Version ist 5.8.8

Meine Skripts enthält Threads ... Ich kann den Code nicht teilen, aber wollte wissen, ob jemand Erfahrung mit dieser Art von Fehlern hatte und wie Sie es gelöst/angegangen/analysiert hatten. Gibt es irgendwelche Werkzeuge/Protokolle, auf die ich zurückgreifen könnte, um an solchen Problemen zu arbeiten?

Vielen Dank für Ihre Unterstützung.

P.S: Ich weiß, dass Threads nicht die idealen Freunde für jemanden sind. Ich kontrolliere jedoch nicht die Entscheidung, Perl zu verwenden. Ich behalte nur den Code.

Antwort

2

Code öffnen und irgendwo vor, wo das Problem auftritt, in sie:

$DB::single=1; 

Dann

PERL5OPT='-dt' perl yourscript.pl 

und traf

c[enter]

wiederholt ausgeführt, bis das Problem erneut auftritt . (Beachten Sie, ob es bei Ihrem manuellen Haltepunkt anhält oder nicht, bevor es scheitert).

Dann verschieben Sie iterativ den manuellen Haltepunkt vorwärts/zurück, bis Sie ihn nur vor Ihrem Endpunkt haben (Sie könnten den Todpunkt mit einer Reihe von Druckbefehlen auch finden), und dann von dort aus arbeiten, möglicherweise mit pre Introspektion.

Dies wird (hoffentlich) Ihnen helfen, einen Testfall zu generieren, der das Problem aufweist.

+0

Das Bremsen in Threads bekam eine Menge Kopfschmerzen für mich .. Danke für diese Info. :) So konnte ich tatsächlich herausfinden, was das Problem war. Bin gerade nicht zurückgekommen und habe deine Lösung markiert. – kingpin

1

Die wahrscheinlichste Ursache ist eine inkompatible Version von glibc. Sie müssen Perl mit der Version von glibc ausführen, mit der es kompiliert wurde

+0

Ich benutze Perl mit Ubuntu installiert. Ich glaube, dass das standardmäßig installierte Perl mit der glibc-Version kompatibel sein sollte. Plus Ich habe das gleiche Problem auf RHEL5 auch erlebt. Es sollte also nicht sein, dass beide Systeme Versionskonflikte haben könnten. – kingpin

1

Das sieht wie ein interner Fehler in Perl aus. Das "double free or corruption" bezieht sich darauf, dass Speicher zweimal freigegeben oder beschädigt wird. Perl verwaltet den Speicher für Sie, also sollte dies nie passieren, wenn Perl richtig funktioniert.

Gibt es eine neuere Version von Perl, auf die Sie upgraden können?

+0

Ich benutze perl 5.8.8 ... Ich kann auf 5.8 upgraden.8 aber das Produkt, das ich arbeite, wird nur am 5.8.8 unterstützt. Gibt es noch andere Tools, die ich an den Debugger anschließen und die Aktionen überwachen kann und genau feststellen kann, an welchem ​​Punkt das Skript abgebrochen wurde. – kingpin

+0

Ich persönlich würde versuchen, auf 5.8.9 zu aktualisieren. Es sollte eine Wartungsversion sein, daher ist es unwahrscheinlich, dass Ihre Anwendung beschädigt wird. Die Release-Ankündigung für Perl 5.8.9 erwähnt eine Fehlerbehebung für ein ThreadSafe-Problem. Dies könnte genau dein Problem sein. http://search.cpan.org/~nwclark/perl-5.8.9/pod/perl589delta.pod#Smaller_fixes Theoretisch könnten Sie einen Debugger an Perl anhängen und versuchen, mehr über das Problem zu erfahren. Das wäre sehr ehrgeizig. –

2

This thread auf der Mailingliste perl5 Porters scheint darauf hinzuweisen, dass es ein bekanntes Problem mit 5.8.8 und Threads ist. Ich denke dein Problem ist wahrscheinlich auf ein Code-Problem zurückzuführen, das nicht von Perl abgefangen wird.

Wenn Sie können, würde ich vorschlagen, den Code zu einem minimalen Beispiel zu strippen. Sie sollten dann in der Lage sein, das Codeproblem zu beheben.

+0

Den Code abzustreifen sucht nach einer schweren Aufgabe. Ich möchte es als letzten Ausweg tun. Haben wir irgendwelche Visualisierungstools für Perl-Threads? Oder bin ich zu ehrgeizig? – kingpin

+0

http://delta.tigris.org ist ein gutes Werkzeug, um einen minimal reproduzierbaren Testfall zu erstellen. Es sollte keine schwere Aufgabe mit der richtigen mechanischen Hilfe sein :) – ephemient

+0

Nach ähnlichen Threads wie Newt hatte darauf hingewiesen, dass dies ein bekanntes Problem ist und wird in den zukünftigen Versionen behandelt werden. Ich ersetzte den Abschnitt, wo ich bezweifelte, dass das Problem mit einem alternativen Hack war. Arbeitet gut .. Danke für den Zeiger ... – kingpin

0

Versuchen Sie, 'threads' und 'threads :: shared' Module von CPAN zu aktualisieren.

Verwandte Themen