Я пишу диспетчер памяти для приложения в составе группы из двадцати с лишним программистов. У нас заканчивается квота памяти, и нам нужно иметь возможность видеть, что происходит, поскольку мы используем только около 700 МБ. Мне нужно сообщить, к чему все идет - фрагментация и т. д. Есть идеи?





Для этого вы можете использовать существующие инструменты отладки памяти, я обнаружил, что Memory Validator 1 весьма полезен, он может отслеживать выделение как уровня API (куча, новый ...), так и уровня ОС (виртуальная память) и отображать карты виртуальной памяти.
Другой вариант, который я также нашел очень полезным, - это возможность выгружать карту всего виртуального пространства на основе функции VirtualQuery. Мой код для этого выглядит так:
void PrintVMMap()
{
size_t start = 0;
// TODO: make portable - not compatible with /3GB, 64b OS or 64b app
size_t end = 1U<<31; // map 32b user space only - kernel space not accessible
SYSTEM_INFO si;
GetSystemInfo(&si);
size_t pageSize = si.dwPageSize;
size_t longestFreeApp = 0;
int index=0;
for (size_t addr = start; addr<end; )
{
MEMORY_BASIC_INFORMATION buffer;
SIZE_T retSize = VirtualQuery((void *)addr,&buffer,sizeof(buffer));
if (retSize==sizeof(buffer) && buffer.RegionSize>0)
{
// dump information about this region
printf(.... some buffer information here ....);
// track longest feee region - usefull fragmentation indicator
if (buffer.State&MEM_FREE)
{
if (buffer.RegionSize>longestFreeApp) longestFreeApp = buffer.RegionSize;
}
addr += buffer.RegionSize;
index+= buffer.RegionSize/pageSize;
}
else
{
// always proceed
addr += pageSize;
index++;
}
}
printf("Longest free VM region: %d",longestFreeApp);
}
Вы также можете узнать информацию о кучах в процессе с помощью Heap32ListFirst / Heap32ListNext и о загруженных модулях с помощью Module32First / Module32Next из API справки по инструментам.
«Справка по инструментам» возникла в Windows 9x. Первоначальным API информации о процессе в Windows NT был PSAPI, который предлагает функции, которые частично (но не полностью) перекрываются со справкой по инструментам.
Наше (огромное) приложение (игра Win32) недавно начало выдавать исключения «Недостаточно квоты», и мне было поручено выяснить, куда уходит вся память. Это нетривиальная работа - этот вопрос и Вот этот были моими первыми попытками выяснить. Поведение кучи является неожиданным, и точное отслеживание того, сколько квоты вы использовали и сколько доступно, пока невозможно. На самом деле, это в любом случае не особо полезная информация - «квота» и «место для хранения вещей» - тонко и досадно разные понятия. Принятый ответ настолько хорош, насколько это возможно, хотя перечисление кучи и модулей также удобно. Я использовал DebugDiag от MS, чтобы увидеть истинный ужас ситуации и понять, насколько сложно на самом деле все тщательно отслеживать.
похоже, вы пропустили ссылку на MemoryValidator, так как есть довольно много инструментов с таким именем, которые вы, возможно, захотите сделать явным