Mögliche obskure Ursachen für den abstrakten Fehler in Delphi?

8

In einem Delphi 7 Projekt haben wir FastMM installiert. Bald darauf bemerkten wir, dass eines der Formulare beim Schließen die Fehlermeldung "Abstract Error" (Fehlermeldung) ausgab. Ich habe das ausführlich getestet und kann den Grund dafür nicht finden. Der übliche Grund für diese Fehlermeldung scheint hier nicht zu gelten. Die Anwendung definiert keine abstrakten Klassen. Ich suchte auch das Formular für eine mögliche Verwendung von TStrings oder so ähnlich. Am wichtigsten ist, dass wir dieses Formular nicht geändert haben (naja, wir denken, dass wir es nicht getan haben). Es ist einfach kaputt gegangen.

  1. Gibt es andere mögliche Ursachen für diesen Fehler neben dem Versuch, eine nicht implementierte Methode aufzurufen?
  2. Gibt es eine Möglichkeit, dass FastMM einen obskuren Fehler in der Anwendung aktiviert hat, der bis jetzt verborgen geblieben ist?

Wenn die Antwort auf diese Fragen nein ist, dann suche ich einfach weiter nach einem nicht implementierten Methodenaufruf, erleichtert, dass ich etwas anderes nicht verpasse.

    
Escape Velocity 12.08.2012, 18:05
quelle

4 Antworten

11

Wenn eine Speicherbeschädigung vorliegt, können alle Arten von Fehlern ausgelöst werden, und es ist sehr schwierig, die Ursache zu finden.

Um Ihre Fragen zu beantworten: 1) Ja abstrakter Fehler kann auch durch Speicherbeschädigung verursacht werden, und 2) Ja, wenn FastMM aktiviert wird, können Fehler sichtbar gemacht werden, die normalerweise unbemerkt bleiben (aber immer noch behoben sein sollten).

Einige allgemeine Hinweise zum Auffinden von Speicherfehlern:

  1. Versuchen Sie die Einstellung "FullDebugMode" in FastMM.
  2. Stellen Sie sicher, dass alles, was Sie erstellen, mit einem Free übereinstimmt.
  3. Stellen Sie sicher, dass nichts mehr als einmal freigegeben wird.
  4. Stellen Sie sicher, dass ein Objekt nicht verwendet wird, nachdem es freigegeben wurde (oder bevor es erstellt wurde).
  5. Aktivieren Sie Hinweise und Warnungen (und beheben Sie sie, wenn sie auftreten).
Ville Krumlinde 12.08.2012, 18:20
quelle
3

"Es ist einfach kaputt" - es war wahrscheinlich immer kaputt, aber jetzt weißt du es.

Ich habe Probleme beim Schließen eines Formulars als Teil eines Schaltflächenereignisses gesehen. Das Formular wird gelöscht, und der Rest der Schaltflächenmeldungen wird an eine nicht mehr vorhandene Schaltfläche gesendet. Die Release-Methode vermeidet dies, indem (aus dem Speicher) eine wm_close-Nachricht zurück an das Formular

gesendet wird     
Kiwiflyer 13.08.2012 03:27
quelle
2

Beantworten Sie Frage 1:

Ja. Dies hat in meinem Fall einen Abstract Error verursacht:

%Vor%

Das hat funktioniert, als der Sender eine TButton war, aber den Fehler (natürlich) ausgelöst hat, als der Sender eine TAction war.

Antwort zu Frage 2: Ja. Das habe ich auch gesehen. Wir sollten sehr klar sein, dass dies nicht bedeutet, dass FastMM fehlerhaft ist. Der Fehler war "schlafend". FastMM hat es nur ausgelöst.
Eigentlich sollten Sie sich auf FastMM noch mehr verlassen, um Ihr Problem zu finden. Schalten Sie FastMM in den vollständigen Debug-Modus. Es wird dir helfen mit:

  

Stellen Sie sicher, dass ein Objekt nicht verwendet wird, nachdem es freigegeben wurde (oder davor)   wurde erstellt)

In einigen wenigen Fällen wurde das ganze Projekt durcheinander gebracht und ich bekam den Abstract Fehler. Nichts funktionierte, bis ich die DPROJ-Datei löschte. Machen Sie einfach einen Vergleich zwischen Ihrer aktuellen DPROJ-Datei und der in Ihrem Rücken und Sie werden sehen, wie die IDE die Datei auffängt.

    
Sahara 29.08.2014 09:59
quelle
1

Sie könnten versuchen, Ihrem Projekt u_dzAbstractHandler hinzuzufügen. Es sollte den abstrakten Fehler, wo die Methode aufgerufen wurde, auslösen, so dass es einfacher ist, es zu debuggen. Das hilft natürlich nur, wenn der Fehler beim Ausführen im Debugger auftritt.

Ссылка

    
dummzeuch 13.08.2012 08:42
quelle

Tags und Links