über Perl erstellte Webseite erscheint nur Teilweise im Browser
joe23
- perl
Hallo,
ich habe folgendes Problem:
Per Perlscript erzeuge innerhalb einer Webanwendung einen Menubaum. Zum erzeugen lese ich aus einer DB die entsprechenden Daten aus und füge Sie zu einem Auswahlbaum zusammen. Die Darstellung funktioniert im IE und im FF eigentlich gut. Leider kommt es immer wieder sporadisch zu Abbrüchen innerhalb der Darstellung. D.h. wenn ich den Quelltext im Explorer oder FF betrachte ist er "mittendrin" an unterschiedlichen Stellen abgeschnitten. Da auf dem Server weitere Scripte tadellos ihren Dienst tun, Perl keine Fehler ausgibt beim Durchlauf des Scriptes ausgibt kann ich den Fehler nicht einmal eingrenzen. Hat jemand einen Tipp?
Hier die Details:
-IIS
-perl 5.6
--module DBI; Storable;Datecalc;cgi:strict
-erzeugter Code für ausgabe: HTML;javascript(innerhalb des HTML);css;
-im Script habe ich viel mit hashes und Pointer ($hash->{$var}->($var2)...) gearbeitet.
Mit bitte um Antwort und frundlichen Gruß
Joe23
ich habe folgendes Problem:
Debugging von CGI Skripten ist immer wieder schwierig, weil du nicht alles mitgeteilt bekommst, was falsch läuft. es hilft viel wenn du use strict verwendest, was du schon tust. Dann kann hilfreich sein, die warnungen anzuschalten und dann entweder im Logfile nachsehen, dort schreibt Perl die Warnungen rein oder du gibt die mit CGI::Carp aus. Damit könntest du evtl. Hinweise bekommen, was falsch läuft.
Struppi.
ich habe folgendes Problem:
vielen Dank für die schnelle Antwort. Werde morgen cgi:carp mal ausprobieren.
und mich danach melden. :)
joe23
ich habe folgendes Problem:
Das Carp-Modul habe ich eingebunden. Beim testen konnte ich den Fehler ein wenig eingrenzen:
Da ich nicht die CGI-tag aus dem CGI Module benutze schreibe ich über print-Befehle den gesamten Output auf STDOUT. Dieser erscheint im Fehlerfall nur Teilweise auf dem Browser(reproduzierbar). Definiere ich nun zwischen den einzelnen prints eine Variable (zb my $var='';) so verschwindet der Fehler d.h die gesamte Seite wird zur Anzeige gebracht.
Als Bsp:
....
print ' </fieldset>'."\n";
print ' </div>'."\n";
print ' <fieldset>'."\n";
print ' <legend title="XXXX auswählen"> XXXX: </legend>'."\n";
print ' <div id="0">'."\n";
my $testoutput=''; ##diese Zeile ist eingebunden: Ohne-> Abbruch;Mit ->kein Abbruch
print ' </div'."\n";
...
Leider gibt es weder im Logfile noch im Browser eine FM.
Im SYSTEM-LOG vom Server steht:
Das Skript, das vom URL '/XXX/cgi/XXX.cgi' mit den Parametern 'XX=96' gestartet wurde, gab innerhalb der konfigurierten Zeitspanne keine Rückmeldung. Der HTTP-Server beendet das Skript.
Weitere Informationen ....
und der Perlprozess läuft als Zombie weiter bis ich ihn kille.
mfg und bitte um Antwort..
joe23
Da ich nicht die CGI-tag aus dem CGI Module benutze schreibe ich über print-Befehle den gesamten Output auf STDOUT.
Das ist schlecht und macht den Code natürlich schwerer wartbar.
Leider gibt es weder im Logfile noch im Browser eine FM.
Im SYSTEM-LOG vom Server steht:
Das Skript, das vom URL '/XXX/cgi/XXX.cgi' mit den Parametern 'XX=96' gestartet wurde, gab innerhalb der konfigurierten Zeitspanne keine Rückmeldung. Der HTTP-Server beendet das Skript.
das ist ganz schlecht, das kann bedeuten, dass du irgendwo eine Endlosschleife hast. Sowas zu finden ist sauschwierig.
Bei sowas musst du aufpassen, mein Hoster hat eine komplette Domain von mir mal gesperrt wegen solcher Zombies.
Was du machen kannst, ist einen Alarm zu setzen und dir ausgeben lassen wo das Skript hängt.
In etwa so, am besten in einem BEGIN {} Block.
$SIG{ALRM} = sub { my @c = caller; die "Zeitlimit at @c"; };
alarm(10);
Hier wird das Skript dann nach 10 Sekunden von selbst beendet.
Struppi.
Das ist schlecht und macht den Code natürlich schwerer wartbar.
Ich weis, aber das Script ist halt schon ein paar Tage alt. :(
das ist ganz schlecht, das kann bedeuten, dass du irgendwo eine Endlosschleife hast. Sowas zu finden ist sauschwierig.
komisch ist aber:
-wenn ich im Script eine Zeile Code einfüge klappt es.
-ich sehe im Browser von einem print '<option value="z_empty" > </option>';
nur Bruchstücke zb <option value="z_ (der rest ist abgehackt!)
Den Tip mit dem ALARM werde ich mal einbauen
joe23
Das ist schlecht und macht den Code natürlich schwerer wartbar.
Ich weis, aber das Script ist halt schon ein paar Tage alt. :(
Naja, das CGI Modul ist ca. 10 Jahre alt.
das ist ganz schlecht, das kann bedeuten, dass du irgendwo eine Endlosschleife hast. Sowas zu finden ist sauschwierig.
komisch ist aber:
-wenn ich im Script eine Zeile Code einfüge klappt es.
-ich sehe im Browser von einem print '<option value="z_empty" > </option>';
nur Bruchstücke zb <option value="z_ (der rest ist abgehackt!)
Ja wie gesagt es ist schwierig in einem CGI Skript Fehler zu finden, daher sollte man schon beim schreiben möglichst vielen Fallen aus dem Wege gehen. Der Punkt ist, dass irgendwo wird aus irgendeinem Grund das Skript abgebrochen. Normalerweise solltest du, wenn du die Warnungen eingeschaltet hast und use strict verwendest und nicht die Meldungen irgendwo unterdrückt hast (oder ein Modul dies tut), diese Meldung im Fehlerlog finden. Alles andere wäre Vodoo, also nicht erklärbar.
Ein Programm bricht nicht einfach ab, sondern nur wenn ein Fehler auftaucht oder eben, was du ja auch schon angedeutet hast, wenn der Server oder das System es killt.
D.h. im für dich günstigsten Fall ist einfach nur die Laufzeit der Skript vom Server zu kurz beschränkt oder deine Seite so gut besucht, dass diese überschritten wird. Indem Fall hilft nur aufrüsten oder evtl. der Umstieg auf mod_perl
Den Tip mit dem ALARM werde ich mal einbauen
Damit könntest du zumindest eine eventuell vorhandene Endlosschleife erkennen, wenn der Alaram immer an der selben Stelle ausgelöst wird.
Struppi.
Hallo,
nachdem ich im Script alle Logging-Parameter richtig eingestellt habe( -w! vergessen) bekomme ich nun auch alle Warnings zu sehen. Nach und nach erklärt sich das Problem. Durch undefinierte Variablen kam es zu Problemen bei der Verarbeitung. Die Abbrüche in der Ausgabe kamen wahrscheinlich von <tab>-Zeichen innerhalb der print-befehle.
Jetzt scheint das Problem beseitigt!!(Hoffentlich) ;)
Vielen Dank an Struppi für die vielen Tipps, die letztlich auch zur Lösung geführt haben!!
Joe23
Hi,
-ich sehe im Browser von einem print '<option value="z_empty" > </option>';
nur Bruchstücke zb <option value="z_ (der rest ist abgehackt!)
Das kann daran liegen, dass die Ausgabe nicht direkt, sondern gepuffert erfolgt.
Wenn das Skript dann abschmiert wird der Puffer-Inhalt nicht mehr rausgeschrieben.
mfG,
steckl