Dll Ladeposition und deren Heap-Allokationen zwangsweise >4GB?



  • Ich arbeite gerade an einer etwas älteren Dll+Applikationen (C/C++ VS2008,.Net 2.0, Windows) die ich auf 64Bit portieren will

    Problem: in der Dll und in der Nutzende Applikation gibt es Code der nicht 64Bit Sicher ist - also z.B. (int32) casts auf 64bit Pointer usw. - und davon eine nicht ganz geringe Menge (Projekt ist ein paar 100kLOC gross)

    jetzt hatte ich das Problem das die Software auf einem Server >32GB RAM besonders gerne mal Abstürzt und ich denke das kommt davon das ich hier, im Gegensatz zu meinem Entwicklungsrechner, sehr häufig Allokation usw. oberhalb von 4GB habe - und das Problem dadurch richtig böse wird

    von Hand und mit CppCheck, PVS-Studio usw. arbeite ich mich durch den Code

    Für Dauer-Tests würde ich jetzt gerne meine C/C++ und C# Allokationen dazu zwingen (erstmal egal wie) grundsätzlich nur oberhalb von 4GB zu allokieren

    geht das irgendwie?



  • Mit VirtualAlloc kannst du MEM_TOP_DOWN als Flag verwenden, um Reservierungen im Adressraum so hoch wie möglich zu verlangen. Ich weiß nicht, was malloc / new intern verwendet (Windows hat mehrere Möglichkeiten, Speicher zu reservieren), aber eventuell kannst du deinen Allokator so abändern, dass dieses Flag immer übergeben wird - vorausgesetzt, dass die auch VirtualAlloc verwenden?



  • eventuell kannst du deinen Allokator so abändern, dass dieses Flag immer übergeben wird - vorausgesetzt, dass die auch VirtualAlloc verwenden?

    die Malloc-Stellen sind überschaubar - danke für den Tip

    ansonsten könnte ich ja MEM_TOP_DOWN auch noch für ALLE Applikationen in der Registry aktivieren - könnte aber mit anderen Applikationen Probleme verursachen



  • Beispiel von Valve für unteren Speicher einfach beim Prozess/DLL-Load belegen - damit wird eine Upper 4G Allokation "erzwungen"
    https://randomascii.wordpress.com/2012/02/14/64-bit-made-easy/
    hier sind auch weitere gute Kommentare mit anderen Tips


Anmelden zum Antworten