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 duMEM_TOP_DOWN
als Flag verwenden, um Reservierungen im Adressraum so hoch wie möglich zu verlangen. Ich weiß nicht, wasmalloc / 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 auchVirtualAlloc
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