Gestion des erreurs de mémoire insuffisante

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation de ILINK32 et ILINK64 en ligne de commande


Lorsque vous utilisez le lieur ILINK32 ou ILINK64 de RAD Studio, vous obtenez le message Fatal: Out of memory. Pour remédier au problème, vous devez identifier le tas du lieur qui est en manque de mémoire et augmenter sa taille.

Pour augmenter la taille de la mémoire du tas concerné, procédez comme suit :

1. Accédez à Outils > Options > EDI > Compilation et exécution.
2. Pour voir quel tas du lieur est à l'origine du problème, sélectionnez Diagnostic dans le menu Verbosité.
3. Tentez à nouveau d'utiliser le lieur, et Lorsque vous obtenez le message Fatal: Out of memory, cliquez sur l'onglet Sortie. Il contient des informations supplémentaires qui identifient le tas du lieur en dépassement de mémoire.
4. Dans l'onglet Sortie, trouvez la ligne suivante :

Overrun on linker heap:
Le tas que vous voyez après l'affichage du message Overrun on linker heap: est le tas concerné par le dépassement de mémoire.
Les valeurs relatives à l'ensemble des tas sont listées sous cette ligne. Reportez-vous à l'exemple #Indicateurs de la ligne de commande ci-dessous.
  • Examinez les deux valeurs hexadécimales suivant le nom du tas en dépassement.
  • La première valeur indique la taille requise par le lieur au moment où il réalise que le tas va être dépassé.
  • La seconde valeur indique la taille allouée.
  • Comparez la première et la deuxième valeurs et choisissez une valeur dépassant la première valeur.

Handling errors.png
5. Maintenant, vous pouvez augmenter la taille du tas concerné par le dépassement. Pour cela, accédez à Projet > Options > Lieur C++, puis dans la section Paramètres du tas du lieur, indiquez la nouvelle taille du tas.

  • Sur la plate-forme Windows 32 bits, cinq tas sont disponibles. Dans la plupart des cas, il vous suffit d'augmenter trois d'entre eux. Taille du tas du code, Taille du tas des données ou Taille du tas Info. Reportez-vous aux valeurs exemple utilisées dans un cas de test signalé :
  • Taille du tas du code : 0x14000000
  • Taille du tas des données : 0x0d000000
  • Taille du tas Info : 0x0B000000
  • Taille du tas des données RO : 0
  • Taille du tas TDS : 0
  • Sur la plate-forme Windows 64 bits, quatorze tas sont disponibles. Dans la plupart des cas, il vous suffit d'augmenter deux d'entre eux. Taille du tas Pubtypes Dwarf ou Taille du tas Aranges Dwarf. Reportez-vous aux valeurs exemple utilisées danss un cas de test signalé :
  • Taille du tas du code : 0
  • Taille du tas des données : 0
  • Taille du tas Abbrev Dwarf : 0
  • Taille du tas Aranges Dwarf : 0
  • Taille du tas Info Dwarf : 0
  • Taille du tas Line Dwarf : 0
  • Taille du tas Loc Dwarf : 0
  • Taille du tas Macinfo Dwarf : 0
  • Taille du tas Pubtypes Dwarf : 0x02400000
  • Taille du tas Ranges Dwarf : 0
  • Taille du tas Str Dwarf : 0x08000000
  • Taille du tas Info : 0
  • Taille du tas des données RO : 0
  • Taille du tas TDS : 0
C++Linker.png

6. Effectuez une nouvelle tentative de liaison. Si vous obtenez à nouveau le message Fatal: Out of memory, répétez la procédure car vous devrez peut-être augmenter la mémoire d'autres tas.

Remarque : Chaque application requiert d'augmenter différents tas et différentes valeurs.

Indicateurs de la ligne de commande

En cas de construction en ligne de commande, le lieur émettra un tableau similaire à celui obtenu dans l'exemple suivant :

Turbo Incremental Link64 6.80 Copyright (c) 1997-2017 Embarcadero Technologies,
Inc.
Overrun on linker heap: info
Linker Heaps
------------
info                   0x12271000  0x12000000
code                   0x0487d000  0x08000000
rodata                 0x00159000  0x06000000
data                   0x029bb000  0x08000000
bss                    0x08000000  0x08000000
dwarf_aranges          0x00010000  0x00200000
dwarf_macinfo          0x00010000  0x00200000
dwarf_pubtypes         0x00275000  0x02000000
dwarf_info             0x04e57000  0x06000000
dwarf_abbrev           0x00040000  0x00200000
dwarf_line             0x0124d000  0x02000000
dwarf_str              0x036e0000  0x06000000
dwarf_loc              0x00070000  0x02000000
dwarf_ranges           0x00275000  0x02000000
Fatal: Out of memory

Vous pouvez modifier les tailles de tas utilisées par le lieur via l'indicateur -GH pour les lieurs ilink32 ou ilink64. Utilisez -GH<heapname>=size pour allouer plusieurs tas ou un tas plus grand. Par exemple, pour lier la version de release de la bibliothèque OWLNext (DLL OWLNext library (EN)), nos développeurs C++Builder internes utilisent -GHinfo=0x13000000.

Voir aussi