windows - Visual C ++: muligt at begrænse bunke størrelse?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et problem med en applikation, jeg er fejlfinding. Brug af steady state-hukommelse er nogle få hundrede megabyte. Af og til (efter flere timer) går det ind i en tilstand, hvor hukommelsesforbruget hælder til mange gigabyte. Jeg vil gerne kunne stoppe Programmet, så snart hukommelsesbrugen sker.


Hvor kontrol går gennem min egen kode, kan jeg fange overdreven hukommelsesbrug med kode som denne:


bool usingTooMuchMemory()
{
    PROCESS\_MEMORY\_COUNTERS pmc;
    if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof pmc))
        return pmc.WorkingSetSize > 0x80000000u; // 2GB working set
    return false;
}


Dette hjælper mig ikke, fordi jeg har brug for at teste arbejdsstørrelse på det rigtige tidspunkt. Jeg vil virkelig have programmet at bryde på den første malloc eller new, der tager enten arbejdssæt eller bunke størrelse over nogle Tærskelværdi. Og ideelt set vil jeg gerne have dette gjort ved CRT-bunken selv med minimal overhead, fordi biblioteket kan lide at tildele stort antal små blokke.


Den mistænkte kode er i en DLL, der kører i en tråd oprettet af min kaldkode. DLL'en forbinder statisk med CRT og har ingen særlig heap management. Jeg har kildekode til DLL.


Nogle ideer? Mangler jeg noget indlysende?

Bedste reference


Du kan indstille hukommelsesallokering og deallocation-kroge ved hjælp af \_CrtSetAllocHook. [5]

Andre referencer 1


Du kan tilslutte HeapAlloc -funktionen, som malloc kalder internt, ved at bruge detours-biblioteket. [6]

Andre referencer 2


http://msdn.microsoft.com/en-us/library/aa366778\%28v=vs.85\%29.aspx[7]


Hvis du sletter flag IMAGE\_FILE\_LARGE\_ADDRESS\_AWARE i VS 's linkerindstillinger, vil programmets bunke være begrænset til 2 GB i størrelse, og det bør gå ned, hvis der gøres forsøg på at erhverve hukommelse, der vil sætte den over den grænse.