Behandeln von Linker-Fehlern aufgrund nicht ausreichendem Arbeitsspeicher

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Verwenden von ILINK32 und ILINK64 in der Befehlszeile


In bestimmten Situationen könnten die RAD Studio-Linker ILINK32 oder ILINK64 die Fehlermeldung Schwerer Fehler: Zu wenig Arbeitsspeicher ausgeben. Um diesen Fehler zu beheben, müssen Sie den entsprechenden Linker-Heap ermitteln und den Arbeitsspeicher vergrößern.

So vergrößern Sie den Arbeitsspeicher im betreffenden Heap:

1. Wählen Sie Tools > Optionen > IDE > Compilierung und Ausführung aus.
2. Wählen Sie im Menü Ausführlichkeit die Option Diagnose aus, um zu ermitteln, welcher Linker-Heap das Problem verursacht hat.
3. Versuchen Sie erneut zu linken, und klicken Sie auf die Registerkarte Ausgabe, wenn die Meldung Schwerer Fehler: Zu wenig Arbeitsspeicher angezeigt wird. Diese Registerkarte enthält zusätzliche Informationen, die angeben, in welchem Linker-Heap der Überlauf aufgetreten ist.
4. Suchen Sie auf der Registerkarte Ausgabe die folgende Zeile:

Overrun on linker heap:
Der Heap, der nach der Meldung Overrun on linker heap: angezeigt wird, ist der übergelaufene Heap.
Die Werte für alle Heaps werden nach dieser Zeile aufgeführt. Siehe das Beispiel weiter unten.
  • Sehen Sie sich die beiden hexadezimalen Werte nach dem betreffenden Heap an.
  • Der erste Wert zeigt die für den Linker erforderliche Größe zum Zeitpunkt des Überlaufs des Heap.
  • Der zweite Wert zeigt die zugewiesene Größe.
  • Vergleichen Sie den ersten mit dem zweiten Wert, und legen Sie für den Heap einen Wert fest, der größer als der erste Wert ist.

Handling errors.png
5. Jetzt können Sie die Größe des erforderlichen Heap erhöhen. Wählen Sie dazu Projekt > Optionen > C++-Linker aus, und legen Sie im Abschnitt Heap-Einstellungen des Linkers die neue Heap-Größe fest.

  • Bei der 32-Bit-Windows-Plattform gibt es 5 Heaps. In den meisten Fällen reicht es aus, 3 davon zu vergrößern: Heap-Größe für Code, Heap-Größe für Daten oder Heap-Größe für Info. Hier sind Beispielwerte aus einem gemeldeten Testfall:
  • Heap-Größe für Code: 0x14000000
  • Heap-Größe für Daten: 0x0d000000
  • Heap-Größe für Info: 0x0B000000
  • Heap-Größe für RO-Daten: 0
  • Heap-Größe für TDS: 0
  • Bei der 64-Bit-Windows-Plattform gibt es 14 Heaps. In den meisten Fällen reicht es aus, 2 davon zu vergrößern: Heap-Größe für Dwarf pubtypes oder Heap-Größe für Dwarf aranges. Hier sind Beispielwerte aus einem gemeldeten Testfall:
  • Heap-Größe für Code: 0
  • Heap-Größe für Daten: 0
  • Heap-Größe für Dwarf abbrev: 0
  • Heap-Größe für Dwarf aranges: 0
  • Heap-Größe für Dwarf info: 0
  • Heap-Größe für Dwarf line: 0
  • Heap-Größe für Dwarf loc: 0
  • Heap-Größe für Dwarf macinfo: 0
  • Heap-Größe für Dwarf pubtypes: 0x02400000
  • Heap-Größe für Dwarf ranges: 0
  • Heap-Größe für Dwarf str: 0x08000000
  • Heap-Größe für Info: 0
  • Heap-Größe für RO-Daten: 0
  • Heap-Größe für TDS: 0
C++Linker.png

6. Versuchen Sie, erneut zu linken. Falls die Meldung Schwerer Fehler: Zu wenig Arbeitsspeicher weiterhin angezeigt wird, wiederholen Sie die obigen Schritte, da Sie vermutlich den Arbeitsspeicher auch für andere Heaps vergrößern müssen.

Hinweis: Welche Heaps um welche Werte erhöht werden müssen, ist von Anwendung zu Anwendung unterschiedlich.

Befehlszeilen-Flags

Beim Build über die Befehlszeile gibt der Linker eine Tabelle wie die folgende aus:

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

Sie können die vom Linker verwendeten Heap-Größen mit dem Flag -GH für ilink32 oder ilink64 ändern. Verwenden Sie -GH<Heap-Name>=Größe, um einen größeren Heap oder mehrere Heaps festzulegen. Um beispielsweise die Release-Version der DLL OWLNext library (EN) zu linken, verwenden interne C++Builder-Entwickler -GHinfo=0x13000000.

Siehe auch