Visual C ++: возможно ли ограничить размер кучи? - PullRequest
4 голосов
/ 07 апреля 2011

У меня проблема с отлаживаемым приложением.Стационарное использование памяти составляет несколько сотен мегабайт.Время от времени (через несколько часов) он попадает в состояние, при котором объем используемой памяти возрастает до нескольких гигабайт.Я хотел бы иметь возможность остановить программу, как только это произойдет с использованием памяти.

Там, где управление проходит через мой собственный код, я могу перехватить чрезмерное использование памяти с помощью такого кода:

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

Это не помогает мне, потому что мне нужно проверить размер рабочего набора в нужной точке.Я действительно хочу, чтобы программа работала с первым malloc или new, который принимает рабочий набор или размер кучи выше некоторого порога.И в идеале я хотел бы, чтобы это выполнялось самой кучей CRT с минимальными издержками, потому что библиотеке нравится выделять огромное количество маленьких блоков.

Подозрительный код находится в DLL, работающей в потоке, созданном моимвызывающий код.DLL статически связывается с CRT и не имеет специального управления кучей.У меня есть исходный код для DLL.

Есть идеи?Я что-то упускаю из виду?

Ответы [ 3 ]

4 голосов
/ 07 апреля 2011

Вы можете установить хуки для выделения и освобождения памяти, используя _CrtSetAllocHook .

1 голос
/ 07 апреля 2011

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

Если вы сбросите флажок IMAGE_FILE_LARGE_ADDRESS_AWARE в параметрах компоновщика VS, размер кучи программы будет ограничен 2 ГБ, и он будет аварийно завершать работу, если будут предприняты попытки получить память, которая превысила бы этот предел.

1 голос
/ 07 апреля 2011

Вы можете подключить функцию HeapAlloc, которая вызывает malloc внутри, с помощью библиотеки Detours .

...