Résolution des erreurs internes (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Comment utiliser le débogueur


Le message d'erreur, Erreur interne - X1234 indique que le compilateur a rencontré une condition, autre qu'une erreur de syntaxe, qu'il n'a pas réussi à traiter.

Conseil : Le numéro des erreurs internes indique le fichier et le numéro de ligne où s'est produite l'erreur dans le compilateur. Ces informations peuvent aider le service de support technique à repérer le problème. Veillez à enregistrer ces informations et à les inclure à la description de votre erreur interne.

Pour résoudre une erreur interne

  • Si l'erreur se produit immédiatement après que vous avez modifié du code dans l'éditeur, revenez à l'emplacement où vous avez fait ces modifications et notez ce qui a été changé.
  • Si vous pouvez défaire, ou mettre en commentaire, ce que vous avez modifié et ensuite recompiler avec succès votre application, c'est que la construction de programmation introduite a posé un problème au compilateur. Si c'est le cas, effectuez la procédure ci-dessous, pour la révision du code.

Si le problème persiste

  1. Supprimez tous les fichiers .dcu associés à votre projet.
  2. Fermez complètement votre projet en utilisant Fichier > Tout fermer.
  3. Rouvrez votre projet.Cela effacera le cache des unités maintenu dans l'EDI. Comme alternative, vous pouvez fermer l'EDI et le redémarrer.
  4. Il est aussi possible d'essayer de recompiler votre application en utilisant Projet > Construire pour forcer le compilateur à régénérer tous vos fichiers dcus.
  5. Si l'erreur est toujours présente, quittez l'EDI et essayez de compiler votre application en utilisant la version en ligne de commande du compilateur (dccil.exe) à l'invite de commande. Cela supprimera de l'image mémoire le cache d'unités de l'EDI et pourra aider à résoudre le problème.

Examinez votre code à l'endroit de la dernière modification.

  1. Si le problème persiste, revenez à l'emplacement où vous avez fait les dernières modifications de votre fichier et examinez votre code.

Typiquement, la majorité des erreurs internes peuvent être reproduites avec seulement quelques lignes de code et, souvent, ce code utilise une syntaxe ou des constructions assez inhabituelles ou inattendues. Si c'est le cas, essayez de modifier le code pour qu'il fasse la même chose mais d'une autre façon. Par exemple, si vous transtypez une valeur, essayez de déclarer une variable du type du transtypage et d'effectuer une assignation d'abord.

begin
	if Integer(b) = 100 then...
end;
var
 a: Integer;
begin
  a := b;
  if a = 100 then...
end;		
Voici un exemple de code inattendu que vous pouvez corriger pour résoudre l'erreur :
var
 A : Integer;
begin
 { Below the second cast of A to Int64 is unnecessary; removing it can avoid the Internal Error. }
 if Int64(Int64(A))=0 then
end;
  1. Dans ce cas, le second transtypage de A en Int64 n'est pas nécessaire et sa suppression corrige l'erreur. Si le problème semble être une boucle while...do, essayez de la remplacer par une boucle for...do. Même si cela ne résout pas vraiment le problème, cela peut vous permettre de continuer à travailler sur votre application.Si cela résout le problème, cela ne signifie pas que les boucles while ou for sont endommagées, mais plutôt que vous avez écrit votre code d'une manière inattendue.
  2. Lorsque vous avez identifié le problème, nous vous demandons de créer le cas de test, de la plus petite taille possible, qui reproduise l'erreur et de le soumettre à Embarcadero.

Autres techniques de résolution des erreurs internes

  • Si l'erreur semble provenir d'un code contenu dans une boucle while...do, essayez de remplacer celle-ci par une boucle for...do et vice versa.
  • S'il utilise une procédure ou une fonction imbriquée (une procédure/fonction contenue dans une procédure/fonction), essayez de la désimbriquer.
  • Si elle se produit lors d'un transtypage, essayez des alternatives au transtypage comme l'utilisation d'une variable locale du type requis.
  • Si le problème se pose dans une instruction with, essayez de supprimer entièrement l'instruction with.
  • Essayez de désactiver les optimisations du compilateur avec Projet Projet > Options > Compilateur.

Lorsque tout a échoué

  • l existe de nombreuses façons d'écrire n'importe quel morceau de code. Vous pouvez essayer de résoudre une erreur interne en modifiant le code. Même si ce n'est pas la meilleure solution, cela vous permet de continuer à travailler sur votre application. Si cela résout le problème, cela ne signifie pas que les boucles while ou for sont endommagées, mais peut-être plutôt que la façon dont vous avez écrit votre code était inattendue et a provoqué de ce fait une erreur.
  • Si vous avez essayé de compiler votre code avec la dernière version du compilateur et si l'erreur est encore reéditable, créez le cas de test, de la plus petite taille possible, qui reproduise l'erreur et soumettez-le à Embarcadero. Si elle ne se reproduit pas avec la dernière version, c'est qu'elle a déjà été corrigée.

Configuration de l'EDI pour éviter les erreurs internes

  • Créez un répertoire indépendant pour y placer tous vos fichiers .dcp (fichiers de packages précompilés). Par exemple, créez un répertoire appelé C:\DCP, choisissez Outils > Options d'environnement, sélectionnez l'onglet Bibliothèque et définissez comme répertoire de destination DCP le répertoire C:\DCP. Cette configuration garantira que les fichiers .dcp générés par le compilateur seront toujours actualisés. Ce point est utile lorsque vous déplacez un package d'un répertoire vers un autre. Vous pouvez créer un répertoire .dcu par projet en utilisant Projet > Options > Répertoires/Conditions > Unité.
  • La solution consiste à utiliser les dernières versions de vos fichiers .dcu et .dcp. Sinon, vous risqueriez de provoquer des erreurs internes facilement évitables.

Voir aussi