Interne Fehler beheben (Object Pascal)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu So verwenden Sie den Debugger


Eine Fehlermeldung der Form Interner Fehler: X1234 bedeutet, dass der Compiler auf eine Bedingung gestoßen ist, die keinen Syntaxfehler darstellt und die nicht erfolgreich bearbeitet werden kann.

Tipp:  Die Nummernangabe bei internen Fehlern bezeichnet die Datei und die Zeilennummer im Compiler, in welcher der Fehler aufgetreten ist. Diese Informationen erleichtern dem technischen Support die Eingrenzung des Problems. Fügen Sie diese Informationen daher immer Ihrer Fehlerbeschreibung bei.

So beheben Sie einen internen Fehler

  • Wenn der Fehler unmittelbar nach einer Quelltextänderung im Editor auftritt, kehren Sie zu der betreffenden Stelle im Quelltext zurück, und notieren Sie, was geändert wurde.
  • Machen Sie die Änderungen rückgängig, oder kommentieren Sie sie aus. Wenn die Anwendung nach dieser Maßnahme erfolgreich compiliert werden kann, ist anzunehmen, dass das betreffende Programmkonstrukt den Fehler verursacht. Falls dies so ist, überprüfen Sie zuerst den Quelltext, und führen Sie dann folgende Schritte durch.

Wenn das Problem bestehen bleibt, gehen Sie folgendermaßen vor

  1. Löschen Sie alle .dcu-Dateien, die mit dem Projekt verknüpft sind.
  2. Schließen das ganze Projekt mit Datei > Alle schließen.
  3. Öffnen Sie das Projekt erneut.Dadurch wird der Inhalt des Unit-Puffers der IDE gelöscht. Sie können auch die IDE schließen und neu starten.
  4. Eine weitere Möglichkeit besteht darin, die Anwendung mit dem Befehl Projekt > <Projektname> erzeugen probehalber neu zu compilieren, damit der Compiler alle .dcu-Dateien neu erstellt.
  5. Wenn der Fehler bestehen bleibt, verlassen Sie die IDE und compilieren die Anwendung von einer MS-DOS-Eingabeaufforderung aus mit der Befehlszeilenversion des Compilers (dccil.exe) erneut. Bei dieser Maßnahme wird der Unit-Zwischenspeicher der IDE gelöscht, wodurch das Problem möglicherweise behoben ist.

Überprüfen Sie den Quelltext an der letzten Änderungsstelle

  1. Wenn das Problem immer noch besteht, kehren Sie in der Datei zu der Stelle zurück, an der Sie die letzte Änderung vorgenommen haben, und überprüfen den Quelltext.

Interne Fehler sind oft durch wenige Zeilen reproduzierbar und werden meist durch ungewöhnliche oder unerwartete Konstrukte verursacht. Versuchen Sie in diesem Fall, die Programmierabsicht mit anderen Mitteln umzusetzen. Wenn Sie beispielsweise einen Wert in einen anderen Typ umwandeln, deklarieren Sie eine Variable des Zieltyps, und führen Sie zuerst eine Zuweisung aus.

begin
	if Integer(b) = 100 then...
end;
var
 a: Integer;
begin
  a := b;
  if a = 100 then...
end;		
Hier ein Beispiel für unerwarteten Code, der korrigiert werden kann, um den Fehler zu beheben:
var
 A : Integer;
begin
 { Die folgende zweite Typumwandlung von A in Int64 ist unnötig. Wenn diese Operation entfernt wird, kann der interne Fehler vermieden werden. }
 if Int64(Int64(A))=0 then
end;
  1. In diesem Fall ist die zweite Typumwandlung von A in Int64 unnötig. Wenn diese Operation entfernt wird, ist der interne Fehler vermieden. Wenn das Problem in einer while...do-Schleife zu liegen scheint, versuchen Sie stattdessen eine for...do-Schleife. Obwohl diese Maßnahme nicht das eigentliche Problem behebt, sollten Sie danach wenigstens in der Lage sein, an Ihrer Anwendung weiterzuarbeiten. Wenn sich das Problem mit einer solchen Maßnahme umgehen lässt, bedeutet dies nicht, dass die while- oder for-Schleife fehlerhaft war, sondern dass die Art und Weise der Codierung unerwartet war.
  2. Wenn Sie das Problem eingrenzen konnten, bitten wir Sie, das kleinstmögliche Konstrukt zu extrahieren, an dem der Fehler zu beobachten ist, und dieses an Embarcadero zu übermitteln.

Weitere Verfahren zur Beseitigung von internen Fehlern

  • Wenn das Problem in einer while...do-Schleife zu liegen scheint, versuchen Sie stattdessen eine for...do-Schleife und umgekehrt.
  • Wenn eine geschachtelte Funktion oder Prozedur die Problemstelle zu sein scheint, lösen Sie probehalber die Schachtelung auf.
  • Falls der Fehler sich in einer Typumwandlung befindet, suchen Sie Alternativen für die Typumwandlung, wie z.B. lokale Variablen des erforderlichen Typs.
  • Wenn das Problem in einer with-Anweisung auftritt, entfernen Sie die gesamte with-Anweisung.
  • Deaktivieren Sie probehalber die Compileroptimierungen unter Projekt > Optionen > Compiler.

Wenn alle anderen Mittel versagen ...

  • Natürlich gibt es viele verschiedene Wege, Programmcode zu schreiben. Deshalb kann ein universeller Lösungsansatz für interne Fehler darin bestehen, den kritischen Code umzuschreiben. Dies ist vielleicht nicht immer die schnellste Lösung, ermöglicht es aber zumindest, die Arbeit an der Anwendung fortzusetzen. Wenn sich das Problem mit einer solchen Maßnahme umgehen lässt, bedeutet dies nicht, dass die while- oder for-Schleife fehlerhaft war, sondern dass die Art und Weise der Codierung unerwartet war und deshalb einen Fehler ausgelöst hat.
  • Wenn Sie den Code mit der neuesten Compiler-Version ausprobiert haben und der Fehler weiterbesteht, erstellen Sie den kleinstmöglichen Testfall, der den Fehler produziert, und senden Sie ihn an Embarcadero. Falls der Fehler mit der neuesten Compiler-Version nicht auftritt, wurde das Problem wahrscheinlich bereits mit dem neuen Compiler behoben.

Die IDE zur Vermeidung von internen Fehlern konfigurieren

  • Legen Sie ein Verzeichnis an, in dem Sie alle .dcp-Dateien (vorcompilierte Package-Dateien) ablegen.Erstellen Sie beispielsweise das Verzeichnis C:\DCP, und öffnen Sie unter Tools > Umgebungsoptionen die Registerkarte Bibliothek. Setzen Sie dort das DCP-Ausgabeverzeichnis auf C:\DCP. Dadurch ist sichergestellt, dass die vom Compiler erzeugten <.dcp-Dateien immer aktuell sind. Diese Maßnahme ist sinnvoll, wenn Sie ein Package in ein anderes Verzeichnis verschieben. Mit dem Befehl Projekt > Optionen > Verzeichnisse/Bedingungen > Unit können Sie ein projektbezogenes Ausgabeverzeichnis für die .dcu-Dateien erstellen.
  • Es ist sehr wichtig, dass Sie immer die aktuellsten Versionen der .dcu- und .dcp-Dateien verwenden. Andernfalls können interne Fehler auftreten, die sich leicht vermeiden lassen.

Siehe auch