Announcement

Collapse
No announcement yet.

HILFE! finalization wird nicht ausgeführt!?!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • HILFE! finalization wird nicht ausgeführt!?!

    Hallo liebe Leute,

    heute habe ich ein Programm, das seit Jahren
    klaglos läuft und immer mal wieder erweitert und
    modifiziert wird (Ausführbarer Code inzwischen 2.5 MB)
    ein bißchen verändert (Delphi 5).

    Daraufhin wird der finalization-Abschnitt einer unit
    nicht mehr abgearbeitet, wohl aber der initialization-
    Abschnitt.

    Vergleich mit der Vorversion, wo noch alles funktioniert,
    hat nur ergeben, daß der Compiler die Reihenfolge
    der initialization-Aufrufe für die verschiedenen Units
    geändert hat.

    Alle finalization-Abschnitte werden auch noch fein
    säuberlich in umgekehrter Reihenfolge abgearbeitet,
    außer dem finalization-Abschnitt einer bestimmten Unit.

    Hat jemand eine Idee, woran das liegen könnte?
    Wenn ich das nicht in den Griff kriege, wäre das für
    die weiter Entwicklung des Programms das Aus.

    Mit etwas Panik,
    Uwe.

  • #2
    ok, es gibt ein "workaround", fällt mir ein,
    nämlich so wie früher in Turbo-Pascal üblich
    ein eigenes "finalization" mit subsequenten
    Zeigern zu definieren.

    Aber das wäre eine ziemlich üble Krücke;
    wenn Delphi nicht dazu zu bewegen ist,
    das finalization vollständig abzuarbeiten,
    kann man eigentlich kein Vertrauen in den
    mit Delphi compilierten Programme haben

    Comment


    • #3
      Moin Uwe,

      Das es einen generellen Fehler in der finalization-Abarbeitung bei D5 gibt, wäre mir neu (Updatepack 1 hast Du installiert ? - aber auch ohne kenne ich den Fehler nicht).
      Spontan habe drei Ideen.

      1. Möglichkeit
      Bist Du sicher, dass der finalization-Abschnitt nicht angesprungen wird (Haltepunkt) oder passiert nur nicht das, was lt. Code passieren sollte ?
      Beispiel:
      unit Unit2;
      interface
      uses
      dialogs;
      implementation
      initialization
      ShowMessage('Los geht''s');
      finalization
      ShowMessage('Und aus ...');
      end.
      ShowMessage in finalization wird angesprungen, hat aber keine sichtbaren Folgen.

      2. Möglichkeit
      Nicht die von Dir editierte unit wird verwendet, sondern eine DCU.
      Prüfung: Syntax-Fehler in dem finalization-Abschnitt einbauen - wird er erkannt ?

      3. Möglichkeit
      Programm stürzt vor diesem finalization-Abschnitt ab. Davon würdest Du bei entsprechenden Exception-handling und entsprechend eingestellten Debug-Optionen nichts merken.

      Gruß,
      Geer

      Comment


      • #4
        4. Möglichkeit

        Das Programm wird im Code hart Terminiert. Evtl. in irgendeiner Unit wird Halt aufgerufen

        Comment


        • #5
          Hallo Geert,

          zu 1:
          die initialization -und finalization- Ein bzw Aussprünge
          sehe ich über logfiles die ich aktivieren kann wenn's
          probeme gibt.
          Es ist sicher, daß der initalization-Abschnitt der betreffenden
          unit abgearbeitet wurde, der finalization-Abschnitt nicht.

          Es ist so: damit ich bei Programmende weiß, wann der
          letzte finalization-Abschnitt ausgeführt wurde,
          zähle ich beim Programmstart einen Zähler für jeden
          initialization-Abschnitt hoch. Wenn dann beim Ende
          des Programms der Zähler wieder bei Null ist, weiß ich,
          daß nun alle finalizations abgearbeitet wurden und ich kann
          dann eine letzte kleine Routine abarbeiten, die einige Prüfungen
          macht, zum Beispiel auf Speicherleichen (ein Zähler für die Anzahl
          von Objekten einer bei mir sehr häufig benutzten Basisklasse
          sollte Null sein, sonst hab ich irgendwo Leichen etc).

          Dadurch, daß der einer finalization-Abschnitt nicht abgearbeitet
          wird, läuft mein intialization-Finalization-Zähler beim Programmende nur auf 1 zurück, erreicht die 0 nicht, und die
          o.g. letzte Routine bei Programmschluß wird nie aufgerufen.
          (Das Programm meldet dann z.B. beim nächsten Programmstart,
          daß es nicht ordnungsgemäß heruntergefahren wurde,
          womit ich das problem überhaupt erst entdeckt habe).

          zu 2: kann ich ausschließen, die Unit ist funktionell einzigartig
          und zeigt während des Programmlaufs genau die gewünschten
          Eigenschaften.

          zu 3: kann ich nach dem in 1. gesagten ausschließen:
          die Logfile dokumentiert alle finalization-Aufrufe, bis
          der o.g. Zähler auf 1 heruntergezählt ist; die fehlende Unit
          ist irgendwo in der Mitte beim Abarbeiten der finalizations.

          Ich vermute nun aber, daß ich irgendwo auf dumme Weise
          einen durch Überschreiten (eher Unterschreiten) einer Indexgrenze in den Speicherbereich Nullen schreibe, wo Delphi
          sich die finalization-Einsprungadressen merkt oder so ähnlich,
          so daß die betreffende Unit beim finalization nicht mehr bedacht wird.

          Gruß
          Uw

          Comment


          • #6
            Hallo Bernhard,

            danke für den Kommentar,
            das ist es leider auch nicht, siehe meine Antword an Geert
            zu Punkt 1.

            Gruß Uw

            Comment


            • #7
              Hallo liebe Leute,
              Hallo Geert,
              Hallo Bernhard,

              ich hab's gefunden!

              Als ich meine Antworten auf Eure Kommentare schrieb,
              bin ich darauf gekommen:
              es war tatsächlich ein versehentlicher Speicherzugriff:

              Vereinfacht war es so:

              var
              x : array [1..3] of String;

              :::

              //für i=0 werden hier Delphi-Addressen überschrieben:
              procedure init_x;
              begin
              for i:=0 to 3 do x[i]:='';
              end

              initialization
              init_x; //Hier ist es passiert

              finalization
              //wird nun nicht mehr erreicht.
              end.

              Puhh, ich bin froh, daß es MEIN Fehler war,
              denn den kann ich korrigieren !

              Vielen Dank für Eure Hilfe,
              Eure Kommentare haben mich auf
              die richtige Spur gebracht.

              Gruß Uw

              Comment

              Working...
              X