Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Perl debugger

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 10:58

So langsam fange ich an Perl zu lieben :-) Hab vor 8 jahren schon mal damit gearbeitet. Wie geht das nu mit dem debuggen? Das Script arbeitet einwandfrei alle Datensätze ab, nur an einer Stelle bricht es ab.

Mit -d kann ich zeilenweise durchgehen, ich brauche aber eine Lösung, die mir im Fehlerfall den Fehler anzeigt oder in eine Datei schreibt. Ich kann nicht siebenhunderttausendmal n eingeben bis der Fehler irgendwann auftritt :-(

Wie geht denn das?

Gruß

sean

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 27.10.2005, 11:25

Hallo
700.000 Zeilen? Das ist nicht wirklich dein Ernst oder?
Ich habe einen solchen Fall noch nie erlebt.
Wenn ich zum Thema Perl irgendwas nicht weiß befrage ich perldoc.
kristian@gate2:~> perldoc -q debug
sagt mir:
Found in /usr/local/lib/perl5/5.8.5/pod/perlfaq3.pod
How do I debug my Perl programs?

Have you tried "use warnings" or used "-w"? They enable
warnings to detect dubious practices.

Have you tried "use strict"? It prevents you from using
symbolic references, makes you predeclare any subroutines
that you call as bare words, and (probably most impor-
tantly) forces you to predeclare your variables with "my",
"our", or "use vars".

Did you check the return values of each and every system
call? The operating system (and thus Perl) tells you
whether they worked, and if not why.

open(FH, "> /etc/cantwrite")
or die "Couldn't write to /etc/cantwrite: $!\n";

Did you read perltrap? It's full of gotchas for old and
new Perl programmers and even has sections for those of
you who are upgrading from languages like awk and C.

Have you tried the Perl debugger, described in perldebug?
You can step through your program and see what it's doing
and thus work out why what it's doing isn't what it should
be doing.

Wenn dich -w bzw. use warnings; (ab 5.6) nicht weiterbringt würde ich den Code nach "exit;" durchsuchen. Ein exit wäre das einzige was mir einen Abbruch ohne Fehlermeldung erklären könnte.

Gruss Kristian
Seo-Check Biete Links zu Schmuck und Hochzeit sowie Artikelplätze für Firmen allgemein.

Airport1
PostRank 10
PostRank 10
Beiträge: 4489
Registriert: 16.08.2004, 18:50
Wohnort: Backnang / bei Stuttgart

Beitrag von Airport1 » 27.10.2005, 11:51

use warning; bzw. use strict. Vor allem use strict laesst Dir nix mehr durch die Lappen gehen, hoechstens noch Logikfehler. Perl geht schon gut ab, vor allem sehr performant.
Linktauschanfragen zwecklos
https://www.bot-trap.de/ Spamschutz fuer Webmaster - zentrale Meldestelle fuer Web Spam
https://www.airport1.de/blog/ Lombagruschd Blog mid Gardadierle
https://www.ranking-hits.de/ Counter & PR Service

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 12:21

@Kristian
700.000 Zeilen? Das ist nicht wirklich dein Ernst oder?
Nein, 100 Zeilen, aber ein paar Mio durchläufe :-)

Das mit -w ist ja auch nicht schlecht, aber es nützt alles nix wenn perl das Fenster einfach schließt nach einem Die oder sonstiger Fehler. Gibt es nicht sowas wie "On error goto XYZ" oder sowas?

Am liebsten hab ich die Beschreibung in einer Datei, da ich nicht den ganzen Tag auf den Monitor schauen will.

Gruß

sean

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 27.10.2005, 12:36

Hallo
Ich diagnostiziere jetzt mal blind, dass du vor ner Dose sitzt und das Prog per Doppelklick startest.
Mach dir doch einfach ein Dosfenster auf und tippe "perl x:\pfad\progname.pl" ein. Dann bleibt das (Dos)Fenster auch offen wenn der Fehler auftritt.
Die Alternative wäre ein Umleiten von STDERR auf eine Datei.
Das geht so:

close(STDERR);
open(STDERR,"> debug.txt") or die("open failed $!");

Gruss Kristian
Seo-Check Biete Links zu Schmuck und Hochzeit sowie Artikelplätze für Firmen allgemein.

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 13:06

Ich diagnostiziere jetzt mal blind, dass du vor ner Dose sitzt und das Prog per Doppelklick startest.
Dose ja, entweder mit Doppelclick oder in Dos Box, da dort bei den meisten Fehlern eine Meldung ausgegeben wird. Nur nicht in diesem Fall.

Ich probier es jetzt mal mit close(stderr)....

Gruß

sean

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 13:08

wo muß die close err Anweisung hin? Habs mal ganz unten und ganz oben und in der Mitte probiert.

<edit>hab die debug.txt gefunden :-) Klappt - Fehler behoben!
Mega Danke!
</edit>

Gruß

sean

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 13:49

Hier kommt der Fehler:

$x = inet_ntoa(inet_aton($phost));

folgender Fehler:
Bad arg length for Socket::inet_ntoa, length is 0, should be 4 at datei.pl line 288, <STDIN> line 1.

$phost ist aber nicht leer. Wie kann ich dieser Funktion beibringen, bei fehlerhaftem Ergebnis einfach weiter zu machen?

Gruß

sean

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 27.10.2005, 14:04

Hallo
inet_ntoa() bekommt den Rückgabewert von inet_aton(),
Beides sind Funktionen des Moduls Socket,
Wer benutzt das denn pure? Irgendwie denke ich dass bei der Benutzung von LWP diese Fehler schon abgefangen würden.
Egal.

my $xyz = inet_aton($phost);
if(length($xyz) == 4){
$x = inet_ntoa($xyz);
}else{
# hat nicht geklappt und wir muessen was machen
# das kann ein next; sein wenn es in ner Schleife steht
# das kann return sein, wenn es in einer Funktion steht
}

In Deutsch:
Wir schreiben das Ergebnis von inet_aton() erstmal in eine Variable $xyz und prüfen diese zumindest auf die richtige Länge.
Wenn das wie hier erwartet 4 ist machen wir das was das Prog halt macht, ansonsten haben wir den Fehler abgefangen und müssen dann irgendwie darauf reagieren.

Gruss Kristian
Seo-Check Biete Links zu Schmuck und Hochzeit sowie Artikelplätze für Firmen allgemein.

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 15:39

hmm, erst inet_aton abzufragen und auszuwerten habe ich auch versucht. Ging irgendwie nicht. Mit deiner Bedingung klappt es :-) *freu*

Ich danke dir Kristian! Wesentliche Lernkurve war der Fehlerabfang der von jetzt ab in einer Datei landet :-) Yeaaahhhh - das rockt!

Gibt es sowas wie flush() aus php auch für perl? Manchmal haut er das Zeug nicht live auf den Bildschirm.

Gruß

sean

bsnoop
PostRank 5
PostRank 5
Beiträge: 205
Registriert: 01.09.2004, 22:12

Beitrag von bsnoop » 27.10.2005, 16:07

Ich weiß zwar nicht Bescheid in PHP aber ich denke du meinst das:

$| = 1;

Damit wird das ausgegeben was gerade vom Script produziert wird, und nicht erst gewartet bis das Script die komplette Ausgabe zusammengestellt hat.

Code: Alles auswählen

$| = 1;
print "Hallo\n";

sleep&#40;4&#41;;

print "Moin";
Hier wird das Hallo ausgegeben und nach 4 Sekunden das Moin.

Ansonsten würde nach 4 Sekunden beides ausgegeben werden.

$| = 0;

schaltet das ganze wieder zurück.

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 16:21

@bsnoop

danke dir, genau was ich brauchte :-)

Gruß

sean

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 16:29

sollte man zurückschalten? $| = 0;

Dürfte egal sein das offen zu lassen, oder?

Gruß

sean

Kristian
PostRank 9
PostRank 9
Beiträge: 1484
Registriert: 20.07.2005, 16:30

Beitrag von Kristian » 27.10.2005, 17:53

Hallo
Mit $|=1; wird der aktuelle Ausgabe-Puffer abgeschaltet.
Das Prog gibt die Daten sofort aus und nicht, wie bsnoop richtig sagte, am Programm-Ende. Dieses Programm-Ende ist aber nicht ganz richtig, mit Puffer werden die Daten auch ausgegeben, wenn der Puffer voll ist. Sinn und Zweck des Puffers ist es das System etwas zu schonen.
Im Grunde genommen braucht dein Rechner diese Schonung nicht, es ja viel wichtiger, dass du die Daten siehst.
Lass den Puffer also weg, es tut nicht weh ;-)
Zu deiner Lernkurve:
Richtig steil wird die erst wenn du perldoc bzw. die Doku zu Perl entdeckst.
Auf Nixen nimmt man das Programm perldoc als Interface zur Doku.
Auf Dosen ist das nicht so toll, im DosFenster. Da hat man aber meist ActiveStatePerl installiert und da ist die Doku im HTML-Format mit dabei.
Schau mal ins Verzeichnis, wo du Perl installiert hast. Da ist ein Verzeichnis / Ordner "html" drin und darin ist die beste Doku der Welt. Ohne wäre Perl nicht das was es ist.
Gruß Kristian
Seo-Check Biete Links zu Schmuck und Hochzeit sowie Artikelplätze für Firmen allgemein.

sean
PostRank 10
PostRank 10
Beiträge: 3396
Registriert: 05.01.2004, 20:26
Wohnort: Leipzig/Karlsruhe

Beitrag von sean » 27.10.2005, 18:14

@Kristian
Mit $|=1; wird der aktuelle Ausgabe-Puffer abgeschaltet.
hab ich jetzt verstanden, brauch man nicht jedesmal schreiben :-)
Richtig steil wird die erst wenn du perldoc bzw. die Doku zu Perl entdeckst.
Klar! Die hab ich... nur hat mir diese und auch Google nicht immer weitergeholfen. Ich danke euch nochmal!

Die Tage werd ich das noch performanter machen!

Sag mal, liegt Windhagen nicht in NRW - ich meine das an der A3 und der ICE Strecke :-)

Gruß

sean

Antworten