perl: Segfault in externem Programm abfangen
Moin, ein Frage: Ich erstelle mir Previews von Fonts (Siehe Signatur :-) ) in perl unter Verwendung von perlMagick/ImageMagick. Bei meinen Fonts sind natürlich auch ein paar kaputte dabei. Daher kann es passieren, daß ImageMagick einen Segmentation Fault hervorruft. Dann bricht das komplette Script ab, ich muß die Datei entfernen und ganz neu starten. Das ist sehr lästig. Gibt es eine Möglichkeit, einen Segmentation Fault abzufangen? Ich weiss ja, daß nichts ernstes dahintersteht. Gruß, Ratti -- http://www.gesindel.de/neu/ | Fontlinge | Die Schriftenverwaltung für LINUX
Moin, Jörg Roßdeutscher:
Gibt es eine Möglichkeit, einen Segmentation Fault abzufangen?
Peter Wiersig:
man perlipc
Ups, Danke schön. Da war ich schon gewesen, hatte es aber wohl übersehen. Anscheinend ist das aber wohl nur begrenzt brauchbar. Der SegFault tritt während eine PerlMagick-Aufrufs auf. Ich kann ihn dort zwar abfangen, er zieht aber eine nicht endenwollende Kette weiterer SegFaults nach sich und kehrt "nie" wieder in die aufrufende Routine zurück. Der manpage entnehme ich, daß perl nach einem SegFault ohnehin mehr tot als lebendig ist. Kann ich bestätigen. Ich versuche es jetzt anders und fork'e vor dem PerlMagic-Aufruf. Entweder gelingt es, dann beendet sich das Child regulär, oder es gelingt nicht, dann bricht der SegFault das Child ab. Das funktioniert jetzt so halbwegs. Denn dummerweise eine MySQL-Datenbank offen, die das fork'en und abbrechen gar nicht mag. Wie ist das, wenn ich fork'e, während die Datenbank offen ist, und das Child schliesst die Verbindung? Eigentlich müsste sie für den ursprünglichen Prozess weiter offen sein? Das scheint auch zu funktionieren, nur wenn ich mich jetzt zusätzlich im Child dazu entschliesse, die SegFaults jetzt doch wieder abzufangen, um die problematischen Dateien anzuzeigen, dann scheint das gelegentlich im ursprünglichen Prozess die Verbindung zu MySQL zu stören. Anbei mal mein Code, gekürzt: # Erzeugen von Vorschaubildern aus Fonts sub create_image { my $fork_id=fork(); if ($fork_id == 0) { #Child braucht kein MySQL mehr &close_database; # Alle SIGs abfangen foreach my $i (keys(%SIG)) { $SIG{$i} = \&catch_segfault; } # Dieser Befehl crashed bei # defekten Fontfiles: $image->Annotate(x=> 0, y=>40, font=>$filename, pointsize=>40, fill=>'black', text=>'Fontlinge äöüß'); # Also hier evtl. irregulaer beenden # Keine SIGs abfangen foreach my $i (keys(%SIG)) { $SIG{$i} = 'DEFAULT'; } $image->Write("$path$base.png"); # spetestens hier regulaer beenden exit; } elsif (!defined $fork_id) { die "Could not fork\n"; } } Hab ich einen Denkfehler? Gruß, Ratti P.S.: perlipc und perlopentut gelesen. -- http://www.gesindel.de/neu/ | Fontlinge | Die Schriftenverwaltung für LINUX
On Die, 23 Jul 2002 at 20:53 (+0200), Jörg Roßdeutscher wrote:
Gibt es eine Möglichkeit, einen Segmentation Fault abzufangen?
Peter Wiersig:
man perlipc
Ups, Danke schön. Da war ich schon gewesen, hatte es aber wohl übersehen.
Anscheinend ist das aber wohl nur begrenzt brauchbar. Der SegFault tritt während eine PerlMagick-Aufrufs auf. Ich kann ihn dort zwar abfangen, er zieht aber eine nicht endenwollende Kette weiterer SegFaults nach sich und kehrt "nie" wieder in die aufrufende Routine zurück. Der manpage entnehme ich, daß perl nach einem SegFault ohnehin mehr tot als lebendig ist. Kann ich bestätigen. [...]
Warum nutzt Du dann nicht einfach convert auf Shell-Ebene (per system oder open und "... |")? Ist zwar nicht schön, aber dafür stören Dich segfaults nicht mehr (convert ist mir bei einer kaputten Datei auch noch nie abgeschmiert). Jan
Moin, Jan Trippler:
Warum nutzt Du dann nicht einfach convert auf Shell-Ebene (per system oder open und "... |")? Ist zwar nicht schön, aber dafür stören Dich segfaults nicht mehr (convert ist mir bei einer kaputten Datei auch noch nie abgeschmiert).
Dort kann ich nicht die detaillierten Zugriffsmöglichkeiten von PerlMagic nutzen: Ein Vorschaubild erzeugen und detailliert auszeichnen. Ist aber auch egal, denn dahinter steckt die gleiche Routine, und daher: ratti@ratti:~/Desktop> convert Harding3.ttf x.png Speicherzugriffsfehler Man muß den Entwicklern von ImageMagick zugute halten, daß nur 0,002% meiner Fonts diesen Effekt hervorrufen, und ich werde diese Schriften auch mal "rüberschieben". Aber es gibt sie. :-) Gruß, Ratti -- http://www.gesindel.de/neu/ | Fontlinge | Die Schriftenverwaltung für LINUX
On Die, 23 Jul 2002 at 23:03 (+0200), Jörg Roßdeutscher wrote:
Jan Trippler:
Warum nutzt Du dann nicht einfach convert auf Shell-Ebene (per system oder open und "... |")? Ist zwar nicht schön, aber dafür stören Dich segfaults nicht mehr (convert ist mir bei einer kaputten Datei auch noch nie abgeschmiert).
Dort kann ich nicht die detaillierten Zugriffsmöglichkeiten von PerlMagic nutzen: Ein Vorschaubild erzeugen und detailliert auszeichnen.
Ich kenne PerlMagic nicht - machst Du das interaktiv? Wenn nein - convert beherrscht selbstverständlich auch Sizing, Korrekturen usw. Wie gesagt - ich weiss nicht, was Du genauer machen willst, aber ein Blick in die manpages von convert, ImageMagick + Co. sollte da Klarheit bringen.
Ist aber auch egal, denn dahinter steckt die gleiche Routine, und daher:
ratti@ratti:~/Desktop> convert Harding3.ttf x.png Speicherzugriffsfehler
Man muß den Entwicklern von ImageMagick zugute halten, daß nur 0,002% meiner Fonts diesen Effekt hervorrufen, und ich werde diese Schriften auch mal "rüberschieben". Aber es gibt sie. :-)
OK, mit Fonts habe ich nix am Hut. Aber Dein Perl-Script würde nicht betroffen sein, wenn Du system() nutzt ;-) Jan P.S.: Probier doch einfach mal PerlMagic mit Perl 5.8 aus!
Moin, Jörg Roßdeutscher:
Dort kann ich nicht die detaillierten Zugriffsmöglichkeiten von PerlMagic nutzen: Ein Vorschaubild erzeugen und detailliert auszeichnen.
Jan Trippler:
Ich kenne PerlMagic nicht - machst Du das interaktiv? Wenn nein - convert beherrscht selbstverständlich auch Sizing, Korrekturen usw. Wie gesagt - ich weiss nicht, was Du genauer machen willst, aber ein Blick in die manpages von convert, ImageMagick + Co. sollte da Klarheit bringen.
PerlMagick ist nur eine Anbindung von ImageMagick an perl. Sprich: PerlMagick _ist_ convert (und Co.) Daher hängt mein Programm ja auch bei den gleichen Dateien wie convert. Interaktiv ist das nicht. Mein Script erzeugt über große Schriftensammlungen Datenbanken, sortiert sie nach Aussehen, benennt sie "human readable" um und so. Dazu gehört auch eine Erzeugung von Voransichts-PNGs. Dazu benötige ich die PerlMagick-Funktionen. Es stehen zwar die gleichen Routinen dahinter, aber es gibt sehr viel mehr Parameter als an der Kommandozeile.
P.S.: Probier doch einfach mal PerlMagic mit Perl 5.8 aus!
Das sollte aber ImageMagick nicht beeinflussen? Aber da ich mein Script auch an andere rausgebe, ist mit perl 5.8 noch zu neu. Nützt nix, wenn es bei mir läuft und bei anderen nicht. Dann könnte ich die paar Fonts auch per Hand raussortieren und hätte keine Fehler mehr, die abzufangen sind. ;-) Danke für die Anregungen, Gruß, Ratti -- http://www.gesindel.de/neu/ | Fontlinge | Die Schriftenverwaltung für LINUX
Hallo, On Wed, 24 Jul 2002, Jörg Roßdeutscher wrote:
Interaktiv ist das nicht. Mein Script erzeugt über große Schriftensammlungen Datenbanken, sortiert sie nach Aussehen, benennt sie "human readable" um und so. Dazu gehört auch eine Erzeugung von Voransichts-PNGs.
Schonmal GD getestet? Geht zumindest mit TTFs und ist unabhaengig von ImageMagick, das folgende hab ich grad mal zusammengehackt, da waere natuerlich noch einiges an finetuning noetig, bes. was die Groesse der Bilder angeht usw., aber du kennst ja man/perldoc ;) ,----[ /tmp/test/ttftest.pl ] | #!/usr/local/bin/perl -w | use strict; | use GD; | use GD::Text::Align; | | my @fonts = qw[ | /usr/share/fonts/TrueType/verdana.ttf | /usr/share/fonts.tmp/TrueType/antiqueb.ttf | /usr/share/fonts.tmp/TrueType/antiquen.ttf | ]; | | for my $font ( @fonts ) { | my $fontname = $font; | $fontname =~ s/.*\/([^\/]+)\.ttf/$1/i; | my $img = new GD::Image(128, 64); | my $white = $img->colorAllocate(255,255,255); | my $black = $img->colorAllocate(0,0,0); | my $align = GD::Text::Align->new($img, | valign => 'center', | halign => 'center'); | $align->set_font($font, 12); | $align->set_text($fontname); | $align->draw(64, 32, 0); | $fontname .= ".png"; | open(IMG, ">$fontname") or die $!; | binmode IMG; | print IMG $img->png; | close(IMG); | print STDOUT $fontname, " done\n"; | } | 1; `---- -dnh -- 85: Hot plugable Glüht beim Einstecken auf (Martin Neumann)
Hallo, David Haller:
Schonmal GD getestet? Geht zumindest mit TTFs und ist unabhaengig von ImageMagick, das folgende hab ich grad mal zusammengehackt, da waere natuerlich noch einiges an finetuning noetig, bes. was die Groesse der Bilder angeht usw., aber du kennst ja man/perldoc ;)
Ein interessanter Codeschnippel, der gleich in meine Sourcenschatztruhe gewandert ist. Ich denke, der andere Ansatz bietet aber keine Vorteile. Vektorfonts in diversen Formaten sind eine sehr komplexe Sache. Es gibt sogar einen in PostScript programmierten Webserver! Man wird in freier Wildbahn mit jedem Ansatz auf die eine oder andere Schrift stoßen, die die entsprechende Rendering-Engine gegen die Wand fährt. Es kann m.E. nur noch darum gehen, wie man die fehlerhaften Dateien aussortieren kann. ImageMagick hat dabei eine Stabilität, wie ich sie bisher noch nicht kannte. Dolles Ding. Wenn es mir nur gelänge zu begreifen, wie man mit offener MySQL-Verbindung sauber forken kann. Gruß, Ratti -- http://www.gesindel.de/neu/ | Fontlinge | Die Schriftenverwaltung für LINUX
Moin Moin, Am Donnerstag, 25. Juli 2002 20:19 schrieb Jörg Roßdeutscher:
Es kann m.E. nur noch darum gehen, wie man die fehlerhaften Dateien aussortieren kann. ImageMagick hat dabei eine Stabilität, wie ich sie bisher noch nicht kannte. Dolles Ding. Wenn es mir nur gelänge zu begreifen, wie man mit offener MySQL-Verbindung sauber forken kann.
Ich habe mal einen kleinen Server auf der Arbeit in perl geschrieben, der fork'd und hat eine Mysql Verbindung pro fork. Kommt etwas darauf an, wieviel Du forken mußt, ich meine damit, es ist nicht ratsam zuviele Mysql Verbindungen zu öffnen... Wenn sich das aber im Rahmen hält, könnte man innerhalb des fork() die Verbindung öffnen und schließen... Ich habe für Mysql ein Modul geschireben, wenn Bedarf besteht maile ich Dir den Server, sowie das SQL-Modul zu... Bye Andre
Moin, Andre Heine:
Ich habe für Mysql ein Modul geschireben, wenn Bedarf besteht maile ich Dir den Server, sowie das SQL-Modul zu...
Vielen Dank, aber hier hat sich der "jetzt gehts plötzlich-Effekt" eingestellt. Anscheinend hat der Rechner beim vielen SegFaulten was abbekommen, nach abendlichem herunterfahren lief es dann. Ich habe es auch so wie von dir beschrieben gemacht. Gruß, Ratti -- http://www.gesindel.de/neu/ | Fontlinge | Die Schriftenverwaltung für LINUX
Moin moin, Am Sonntag, 21. Juli 2002 11:54 schrieb Jörg Roßdeutscher:
Ich erstelle mir Previews von Fonts (Siehe Signatur :-) ) in perl unter Verwendung von perlMagick/ImageMagick.
Bei meinen Fonts sind natürlich auch ein paar kaputte dabei. Daher kann es passieren, daß ImageMagick einen Segmentation Fault hervorruft. Dann bricht das komplette Script ab, ich muß die Datei entfernen und ganz neu starten.
Hmm, kann man die Fonts nicht irgendwie auf "Korrektheit" prüfen? Ist nur so eine Idee... Könnte man die Fonts überprüfen, würde es gar nicht zu einem segmentation Fault kommen. Ciao Andre
Hallo, Andre Heine:
Hmm, kann man die Fonts nicht irgendwie auf "Korrektheit" prüfen? Ist nur so eine Idee...
Könnte man die Fonts überprüfen, würde es gar nicht zu einem segmentation Fault kommen.
Theoretisch. Aber die Spezifikationen für TrueType, OpenType und PostScript müßte man wohl über die meisten Brücken getrennt transportieren, damit sie nicht einknicken. ;-) Also: Nein. Gruß, Ratti -- http://www.gesindel.de/neu/ | Fontlinge | Die Schriftenverwaltung für LINUX
participants (5)
-
Andre Heine
-
David Haller
-
Jan.Trippler@t-online.de
-
Jörg Roßdeutscher
-
Peter Wiersig