Christoph Schnauß: nicht auflösbare Fehlermeldung

hallo Forum,

wir haben vor einigen Jahren mal ein vergleichbares Problem diskutiert. Ich weiß nicht mehr, wie ich es damals gelöst habe, aber vermutlich habe ich es gelöst.

Jetzt passiert mir so etwas Ähnliches wieder: ich kriege beim Aufruf eines Perl-Scripts eine Fehlermeldung im log

[Fri Mar 21 01:39:31 2008] [error] [client 172.24.10.2] [Fri Mar 21 01:39:31 2008] forum.pl: Use of uninitialized value $rest[0] in join or string at (eval 24) line 15., referer: http://www.christoph-schnauss.test/cgi-bin/forum.pl?temp

Klar, das ist wegen der TLD "test" und der IP erstmal der lokale virtuelle Host (hier übrigens unter WindowsVista). Das Script selber ist ein Forumscript und mit weit über 4000 Zeilen - verteilt auf mehrere Module - ganz einfach zu groß, um es hier zu posten. Das Problem ist, daß es da nirgends einen Hash, einen Array oder eine Variable mit dem Namen "rest" gibt. Ich habe daher keinerlei Anhaltspunkt, wo ich zur Fehlerbehebung ansetzen müßte.

Die Fehlermeldung selbst deutet darauf hin, daß zu dem Zeitpunkt, zu dem ich das Script eine bestimmte Aufgabe ausführen lasse, irgendeine Variable noch keinen Inhalt hat, also "undefined" ist. Die Angabe von "line 15" führt, wie man dem angegebenen Archivthread entnehmen kann, in die Irre, das ist leider eine der wenigen "Unarten" des CGI-Moduls. Aber woher kommt dieser Name "rest" (value $rest[0])? Den gibt es im gesamten Script und in allen Modulen nicht.

Im übrigen stört diese log-Meldung "eigentlich" nicht. Das Script tut alles, was es tun soll, das heißt, an den gewünschten (X)HTML-Ausgaben und an der Funktionalität gibt es keinerlei "Ausfälle" (naja, bis auf die, von denen ich genau weiß, womit sie begründet sind). Alles ist so, wie ich es haben will. Aber da läuft halt noch irgendwas im Hintergrund, was ich nicht eingrenzen kann, und was zu dieser Fehlermeldung im log führt. Und das muß natürlich "weg". Vor allem, weil es als "error" definiert wird.
Will Perl jetzt auch "nach Hause telefonieren"?

Ähm ... für die Spezialisten: Perl 5.8.8 unter Gentoo, Perl 5.8.8 unter FreeBSD und Perl 5.10.0 unter Windows liefern (bei dem System entsprechend angepaßten Pfaden im Script) alle miteinander dieselbe Fehlermeldung :-(

Grüße aus Berlin

Christoph S.

--
Visitenkarte
ss:| zu:) ls:& fo:) va:) sh:| rl:|
  1. hallo,

    zur Ergänzung:

    Ich habe daher keinerlei Anhaltspunkt, wo ich zur Fehlerbehebung ansetzen müßte.

    ... und welcher Teil meines Codes denn so "relevant" ist, daß ich ihn als Ausschnitt posten könnte.

    Das Script tut alles, was es tun soll, das heißt, an den gewünschten (X)HTML-Ausgaben und an der Funktionalität gibt es keinerlei "Ausfälle" (naja, bis auf die, von denen ich genau weiß, womit sie begründet sind).

    Tatsächlich gibt es in meinen Modulen noch "Baustellen". Daher mal kurz zur Erläuterung: es gibt im "Hauptscript" so etwas:

    #############################  
    ##  
    ##  Standardmodule  
      
    use strict;  
    use CGI;  
    use CGI::Carp qw(fatalsToBrowser);  
      
    my $cgi = new CGI;  
      
    #############################  
    ##  
    ##  eigene Module  
      
    use Variablen;  
    use Neu;  
    use Index;  
    #use Fehler;  
    #use Faq;  
    use Add;  
    use Antworten;
    

    Ich habe also die Module, die "Baustellen" enthalten, schon auskommentiert. Die wären auch mit an Sicherheit grenzender Wahrscheinlichkeit in Bezug auf die angegebene Fehlermeldung völlig unschuldig.

    Falls es gewünscht wird, kann ich die Arbeitsfassung meines Scripts einschließlich der Module natürlich auch auf eine temporäre Adresse als Textdatei(en) hochladen.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
  2. Hallo Christoph!

    Das Problem ist, daß es da nirgends einen Hash, einen Array oder eine Variable mit dem Namen "rest" gibt. Ich habe daher keinerlei Anhaltspunkt, wo ich zur Fehlerbehebung ansetzen müßte.
    Aber woher kommt dieser Name "rest" (value $rest[0])? Den gibt es im gesamten Script und in allen Modulen nicht.

    Ach ja? Benutzt Du einen Editor ohne Suchfunktion? CGI.pm mit Editpad Lite geöffnet, STRG + F, »rest« in die Suchmaske eingegeben und ab:

    erster Treffer, Zeile 238: restore_parameter (den wollen wir aber nicht)
    zweiter Treffer, Zeile 744:

    my ($q,$a,@rest) = self_or_default(@_);

    Ei, was hamma denn da ^^^^^^?

    Ein Array namens »rest«! Und das erklärt vielleicht $rest[0] in Deiner Fehlermeldung...

    In so einem Fall: alle Dateien öffnen, Dateiübergreifendes Suchen, und auch Du wärst fündig geworden, am Einfachsten wäre gewesen, direkt nach einem »@rest« zu suchen, denn $rest[0] ist ja die Ansprechsweise von Array-Elementen.

    Solele, das Debuggen überlasse ich jetzt Dir...

    Viele Grüße aus Frankfurt/Main,
    Patrick

    --

    _ - jenseits vom delirium - _
    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
    Nichts ist unmöglich? Doch!
    Heute schon gegökt?
    1. hallo Patrick,

      CGI.pm [...] geöffnet

      Oh klasse. Auf die Idee, direkt in CGI.pm nachzuschauen, bin ich nicht gekommen.

      am Einfachsten wäre gewesen, direkt nach einem »@rest« zu suchen, denn $rest[0] ist ja die Ansprechsweise von Array-Elementen.

      Das ist natürlich passiert. Gibts aber in "meinem" Script nicht. Wie gesagt, auch noch CGI.pm in die Suche einzubeziegen, ist mir nicht eingefallen.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
    2. hallo Patrick,

      noch ein Nachsatz: es handelt sich um _meine_ Version des uralten WWWBoard-Scripts von Matt Wright. Wir hatten doch da vor noch gar nicht so langer Zeit mal eine kleine Debatte dazu. Mittlerweile kann ich aussagen, daß ich definitv _keine_ ältere Scriptfassung mehr in irgendeinem meiner Archive resp. Backups habe, die älter ist als http://www.scriptarchive.com/download.cgi?s=wwwboard&c=txt&f=wwwboard.pl.

      Was ich selber da gebaut habe, entspricht allerdings in gar keiner Weise mehr dem "Original", von dem ich ursprünglich mal ausgegangen bin. Was ich beibehalten habe, ist eigentlich nur noch die "Idee" (nach der ja auch dieses Forum mal in seinen Anfangstagen funktioniert hat). Also eine "Forumshauptdatei" mit der Threaddarstellung aller Beiträge und die Ablage von Postings in statischen Dateien. Für die Zwecke, für die ich tatsächlich hie und da ein "Forum" benötige, reicht das völlig aus, es wäre zuviel Aufwand, das "Classic-Forum", auf dem wir uns hier bewegen, zu installieren.

      Ich habe das Ding, an dem ich seit 2005 nichts mehr verändert hatte, aber jetzt wieder aus der Kiste ziehen müssen, weil es ein "bot" geschafft hat, mir da Viagra-Werbung reinzuknallen. Das möchte man ja nicht haben.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
  3. [Fri Mar 21 01:39:31 2008] [error] [client 172.24.10.2] [Fri Mar 21 01:39:31 2008] forum.pl: Use of uninitialized value $rest[0] in join or string at (eval 24) line 15., referer: http://www.christoph-schnauss.test/cgi-bin/forum.pl?temp

    Klar, das ist wegen der TLD "test" und der IP erstmal der lokale virtuelle Host (hier übrigens unter WindowsVista). Das Script selber ist ein Forumscript und mit weit über 4000 Zeilen - verteilt auf mehrere Module - ganz einfach zu groß, um es hier zu posten. Das Problem ist, daß es da nirgends einen Hash, einen Array oder eine Variable mit dem Namen "rest" gibt. Ich habe daher keinerlei Anhaltspunkt, wo ich zur Fehlerbehebung ansetzen müßte.

    Du nutzt an irgendeiner Stelle eine Funktion des Moduls mit einem undefinierten Wert. Sind die Warnungen global eingeschaltet?

    Die Fehlermeldung selbst deutet darauf hin, daß zu dem Zeitpunkt, zu dem ich das Script eine bestimmte Aufgabe ausführen lasse, irgendeine Variable noch keinen Inhalt hat, also "undefined" ist. Die Angabe von "line 15" führt, wie man dem angegebenen Archivthread entnehmen kann, in die Irre, das ist leider eine der wenigen "Unarten" des CGI-Moduls. Aber woher kommt dieser Name "rest" (value $rest[0])? Den gibt es im gesamten Script und in allen Modulen nicht.

    Das array @rest kommt im CGI Modul in der Funktion _make_tag_func() vor und wird nur einmal aufgerufen von _compile(), aber das sagt nur aus, dass du eine Funktion verwendest die zur Laufzeit übersetzt wird.

    Meine Vermutung ist, dass du eine CGI Funktion mit den falschen Parametern verwendest.

    Struppi.

    1. hallo Struppi,

      Meine Vermutung ist, dass du eine CGI Funktion mit den falschen Parametern verwendest.

      Möglich. Außerdem ist möglich, daß ich irgendwo eine Variable habe, die wiederum eine andere Variable enthält, und daß nicht die richtige Reihenfolge des Variablenaufrufs gewählt wurde. Ich "hänge" aber ganz einfach bei der Suche nach der richtigen Stelle im Script. Wenn eines meiner Module zum Beispiel einen Fehler enthält, kriege ich sowas zu lesen:
         Unmatched right curly bracket at Add.pm line 60, at end of line
         syntax error at Add.pm line 60, near "}"
      Damit kann ich umgehen. Aber mit diesem dämlichen
         Use of uninitialized value $rest[0] in join or string at (eval 24) line 15
      habe ich halt das Problem, daß es mir ganz einfach nicht die Stelle im Script angibt, wo der Fehler tatsächlich liegt.

      Nur eines ist sicher verständlich: Selbst wenn beim Aufruf im Browser alls "ordnungsgemäß" verläuft und keine Fehler zu sehen sind, ist eine log-Meldung, noch dazu als "error", unbedingt zu beachten.

      Patrick hat die Stelle in CGI.pm gefunden, die immerhin wenigstens den "Namen" @rest erklärt. Das hilft mir allerdings dann bei der Fehlerbeseitigung auch nicht weiter.

      Ich werde das ganze Ding ganz einfach mal nach PHP "transferieren". Wenn das dann auch meckert, kriege ich die Stelle, an der es klemmt, vielleicht raus. Aber es gibt Gründe, weshalb ich beim geplanten Einsatz ganz gerne bei Perl bleiben möchte.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
      1. Patrick hat die Stelle in CGI.pm gefunden, die immerhin wenigstens den "Namen" @rest erklärt. Das hilft mir allerdings dann bei der Fehlerbeseitigung auch nicht weiter.

        Die Stelle zu finden ist kein Problem, ich hab dir ja auch gesagt in welcher Funktion der Fehler auftritt. Das Problem ist der Fehler ist nicht dort, sondern in irgendeinem Aufruf einer CGI Funktion.

        Struppi.

        1. hallo Struppi,

          Das Problem ist der Fehler ist nicht dort, sondern in irgendeinem Aufruf einer CGI Funktion.

          Richtig. Na gut. Dann sollten wir halt das CGI-Modul so umschreiben, daß es auch bei dieser dämlichen "eval"-Fehlermeldung die korrekte Scriptstelle findet und die entsprechende Zeile im log ausgibt - und diese Revision dann im CPAN veröffentlichen. Wäre doch ein akzeptabler SELF-Gedanke, oder?

          Ich habe es bisher als selbstverständlich hingenommen, daß die "core"-Module (wie eben CGI.pm) nicht barbeitet werden müssen. Aber wenn es so aussieht, als sei da eben doch noch was "nachzubessern", ist das doch eine prima Gelegenheit, das SELFHTML-Team in die PERL-Entwicklung zu integrieren ...

          Grüße aus Berlin

          Christoph S.

          --
          Visitenkarte
          ss:| zu:) ls:& fo:) va:) sh:| rl:|
          1. Das Problem ist der Fehler ist nicht dort, sondern in irgendeinem Aufruf einer CGI Funktion.

            Richtig. Na gut. Dann sollten wir halt das CGI-Modul so umschreiben, daß es auch bei dieser dämlichen "eval"-Fehlermeldung die korrekte Scriptstelle findet und die entsprechende Zeile im log ausgibt - und diese Revision dann im CPAN veröffentlichen. Wäre doch ein akzeptabler SELF-Gedanke, oder?

            Welche Version hast du den?

            Struppi.

            1. hallo Struppi,

              Welche Version hast du den?

              Version des CGI-Moduls? Was willst du denn jetzt als Antwort haben? Ich halte meine Systeme möglichst "tagesaktuell" und habe auf dem jeweils benutzten System dann auch die Version von CGI.pm, die grade über "emerge" oder "apt" oder ... als jüngste und aktuellste erreichbar ist.

              Grüße aus Berlin

              Christoph S.

              --
              Visitenkarte
              ss:| zu:) ls:& fo:) va:) sh:| rl:|
              1. Welche Version hast du den?

                Version des CGI-Moduls? Was willst du denn jetzt als Antwort haben?

                Die Nummer der Version, da ich diese Warnungen aus älteren Versionen kenne.Als Beispiel, ich hab die Version 3.10

                Struppi.

                1. hallo Struppi,

                  Version des CGI-Moduls? Was willst du denn jetzt als Antwort haben?
                  Die Nummer der Version

                  Dann nimm "3.29", das entspricht ActivePerl 10.0 unter Windows.

                  Im übrigen hat sich das Problem erledigt. Ich habe meine Variablen bloß ein bißchen umbenannt, und plötzlich läuft alles ohne jede Fehlermeldung.
                  Verstanden habe ich das trotzdem nicht. Das bloße Umbenennen einer Variablen hätte die Fehlermeldung (die ich ja eh bloß im log hatte) eigentlich nicht beseitigen dürfen.

                  Grüße aus Berlin

                  Christoph S.

                  --
                  Visitenkarte
                  ss:| zu:) ls:& fo:) va:) sh:| rl:|
                  1. Version des CGI-Moduls? Was willst du denn jetzt als Antwort haben?
                    Die Nummer der Version

                    Dann nimm "3.29", das entspricht ActivePerl 10.0 unter Windows.

                    Dann muss der Fehler in deinem Skript liegen, mir sind ältere Versionen bekannt die noch nicht strict waren, aber diese ist es sicher. Mir sind solche Meldungen seit Jahren nicht mehr untergekommen, allerdings läßt sich natürlich keine konkrete Aussage treffen, da wir nicht Wissen wie du das Modul nutzt, welche Art der Parameter (um nicht wieder mißverständisse aufkommen zu lassen, ich meine die Parameter die du den Funktionen mitgibst) du verwendest, das Modul behandelt diese ja auf mehrere Art und Weise (die Funktion aus der die Meldung stammt ist genau dafür zuständig, rauszufinden wie du die Parameter an eine CGI Funktion übergibst, die für HTML Tag zuständig ist).

                    Verstanden habe ich das trotzdem nicht. Das bloße Umbenennen einer Variablen hätte die Fehlermeldung (die ich ja eh bloß im log hatte) eigentlich nicht beseitigen dürfen.

                    Das nennt man dann wohl Voodoo.

                    Struppi.

      2. allo Christoph!

        Patrick hat die Stelle in CGI.pm gefunden, die immerhin wenigstens den "Namen" @rest erklärt.

        Und Struppi sogar die sub genannt, in welcher dieses Array erstellt wird...

        Ich werde das ganze Ding ganz einfach mal nach PHP "transferieren".

        Das wäre Hochverrat! ;)

        Zum wwwboard: Mein Gästebuch ist auch nur eine Weiterentwicklung eines Bestehenden (ist sogar zu Beginn des Skripts genannt), allerdings nicht von Matt Wright. Auch hier habe ich ziemlich viel geändert, schon damals beim ersten Einsatz als SELFSPEZIAL-GB.

        Von Matt Wright habe ich noch eine von SourceForge (angeblich) sicherere Variante, die ich aber auch so weit verändert habe, dass sie (bisher) wirklich sicher ist... d.h. bis auf Beweis des Gegenteils.

        Spamaufkommen ist auf jeden Fall null, in den Gästebüchern hinterlassen lediglich Comment Spammer hin und wieder ihre Spuren. Aber das ist nur 1% derer, welche die Stinkefinger-Seite zu sehen bekommen ;)

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
        1. hallo Patrick,

          Ich werde das ganze Ding ganz einfach mal nach PHP "transferieren".
          Das wäre Hochverrat! ;)

          Och, wieso denn? Ich habe schonmal sehr viel gelernt, als ich versucht habe, für mein eigenes Gästebuch eben nicht nur PERL, sondern mit exakt derselben Funktionalität auch PHP einzusetzen. Es ist immerhin eine reizvolle Aufgabe, bei _exakt derselben_ Aufgabenstellung unterschiedliche Scriptsprachen einzusetzen und dann zu vergleichen, wie die Scripts aussehen und was sie tun (auch in Hinsicht auf Performance und Speicherbelastung usw.).
          Derzeit habe ich beide Scripts (also auch beide Sprachen) im Einsatz, und ein "user" bemerkt optisch überhaupt nichts davon.

          Vor zwölf Jahren war das, was sich da als "PHP" darstellte, noch ein Embryo, und PERL war die "angesagte" Technologie, wenn man die CGI-Schittstelle nutzen wollte. Zu dieser Zeit haben wir angefangen, "interaktive" Seiten zu bauen. Auch SELFHTML hat ja anfangs gar nichts von PHP gewußt (und es inzwischen ein paar Jahre lang tapfer ignoriert). Ich bin nun, vermutlich ähnlich wie du, etwas mehr im Umgang mit PERL geübt und setze es rein aus Gewohnheit häufiger ein. Aber warum soll ich deswegen PHP ignorieren? Und/Oder einen Vergleich mit PERL scheuen?

          Zum wwwboard: Mein Gästebuch ist auch nur eine Weiterentwicklung eines Bestehenden

          öhm ... das uralte WWWBoard hat nix mit einem Gästebuch zu tun. Das gab es allerdings bei Matt Wright vor zwölf Jahren auch, es hieß, wenn ich mich richtig erinnere, WWWGuestbook. Ich habs nie benutzt ...

          Von Matt Wright habe ich noch [...]

          Es ist eigentlich erstaunlich, welche "Initialzündung" Matt Wright damals vollbracht hat. Man kann zwar kein einziges seiner Scripts heute noch guten Gewissens in der Originalfassung einsetzen, aber es scheint so, als sei er derjenige gewesen, der überhaupt erstmal gezeigt hat, was man alles mit PERL-Scripts über die CGI-Schnittstelle machen kann. Und zu der Zeit stand ja noch keinerlei "Alternative" (wie PHP) zur Verfügung - abgesehen von C/C++, bloß hat kaum jemand daran gedacht, daß man damit auch CGI-Anwendungen als Open Source bauen und veröffentlichen kann.

          Also: verneigen wir uns mal ein wenig vor Matt Wright, weil er einer der "Wegbereiter" war.

          Grüße aus Berlin

          Christoph S.

          --
          Visitenkarte
          ss:| zu:) ls:& fo:) va:) sh:| rl:|
          1. Hallo Christoph!

            [PHP]

            Nun ja, Hochverrat meinte ich deswegen: nur weil es in Perl (nicht PERL, s. Larry Wall), nicht so läuft wie ich es erwarte, versuche ich es mit PHP ;)

            So hatte sich Deine Bemerkung angehört ;)

            Zum wwwboard: Mein Gästebuch ist auch nur eine Weiterentwicklung eines Bestehenden
            öhm ... das uralte WWWBoard hat nix mit einem Gästebuch zu tun.

            Das war auch nicht das, was ich sagen sollte, sondern ich wollte Deinen Hinweis, dass Du soviel geändert hast, dass man nichts mehr vom Originalskript des MW-Forums erkennt, durch das Beispiel meines GB ergänzen.

            Also: verneigen wir uns mal ein wenig vor Matt Wright, weil er einer der "Wegbereiter" war.

            Ja. Ich weiß noch, dass Stefan Münz mir mal mitteilte, dass er vor dem Veröffentlichen des SELFHTML Forums mit MW sogar gemailt hatte. Natürlich sagte er mir das im Nachhinein, denn Juli 1998 kannte ich Stefan ja noch nicht (BTW: Ja, dieses Jahr feiert das SELFHTML Forum 10jähriges, hoch die Kelche, Tassen, Bembel, Holunderweingläser, oder was auch immer die Leser dieses Beitrages und dieses Forums bevorzugen *g*).

            Matt Wright hat viel zur Verbreitung von Perl (zumindest für Web-Anwendungen, CGI) getan, egal, wie schlecht (aus heutiger Sicht) seine Skripte waren. Nur die damaligen Perler waren lieber unter sich. Nun ja, wie auch immer, ich habe auch lange geglaubt, Perl sei nur im Web einsetzbar ;)

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --

            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?
            1. hallo Patrick,

              Nun ja, Hochverrat meinte ich deswegen: nur weil es in Perl (nicht PERL, s. Larry Wall), nicht so läuft wie ich es erwarte, versuche ich es mit PHP ;)
              So hatte sich Deine Bemerkung angehört ;)

              Hm, dann werde ich an meiner Ausdrucksweise noch ein bißchen feilen müssen. Denn _so_ war das keinesfalls gemeint. Allerdings finde ich es durchaus hilfreich, irgendeine Scriptkonstruktion in unterschiedlichen Sprachen zu vergleichen. Python oder ruby scheiden als "Vergleichssprachen" aus, weil deren Syntax doch zu viele andere Grundlagen enthält. Aber Perl und PHP sind syntaktisch durchaus vergleichbar.

              Zum wwwboard: [...] ich wollte Deinen Hinweis, dass Du soviel geändert hast, dass man nichts mehr vom Originalskript des MW-Forums erkennt, durch das Beispiel meines GB ergänzen.

              Schon klar. Allerdings habe ich im Grunde genommen gar nichts "geändert", sondern mir das WWWBoard nur als Beispiel hergenommen, wie man an die Aufgabe, ein ganzes Forum zu bauen, herangehen kann.

              Matt Wright hat viel zur Verbreitung von Perl (zumindest für Web-Anwendungen, CGI) getan, egal, wie schlecht (aus heutiger Sicht) seine Skripte waren.

              Sie waren doch keineswegs "schlecht". Sie haben "uns" ein paar Möglichkeiten eröffnet, woran man alles denken kann und was sich alles realisieren läßt. Sie waren nur "in ihrer Zeit befangen". Das ist kein Vorwurf. Das trift ja auf alle Scripts, die "wir" heute bauen, genauso zu.

              Grüße aus Berlin

              Christoph S.

              --
              Visitenkarte
              ss:| zu:) ls:& fo:) va:) sh:| rl:|