Как получить информацию, показанную в vmmap программно?

Любой, кто наблюдал за выступлением Марка Руссовича "Раскрытые тайны управления памятью", знает, что инструмент vmmap может показать вам то, что считается с вашим лимитом процесса (2 ГБ в 32-битных окнах vanilla), о котором, похоже, знают немногие другие инструменты.

Я хотел бы иметь возможность программно контролировать мой реальный общий объем памяти (тот, который имеет отношение к пределу процесса), чтобы я мог по крайней мере регистрировать, что происходит, когда я приближаюсь к пределу процесса. Есть ли общедоступная информация о том, как vmmap это делает?

... Кроме того, почему эту информацию так чертовски трудно получить??

Вещи, которые я знаю об этом (AFAIK), не совсем дают вам полную картину:

  • :: GetProcessMemoryInfo выглядит так, как будто он возвращает только информацию об использовании частной памяти
  • System.Diagnostics.Process.VirtualMemorySize64 возвращает довольно большое число, которое все еще не совсем соответствует общему количеству, показанному vmmap - фактически это не соответствует НИЧЕМУ, показанному в vmmap:(

2 ответа

Решение

Я использовал Dependency Walker, чтобы посмотреть, какие функции Windows API были импортированы из Kernel32.dll от vmmap.exe и нашел следующие функции, которые, вероятно, актуальны:

VirtualAlloc
VirtualAllocEx
VirtualFree
VirtualProtectEx
VirtualQueryEx

Взгляните на них и посмотрите, сможете ли вы найти то, что vmmap делается. Конечно, любые другие вызовы API выполняются динамически (т.е. через LoadLibrary) не будет отображаться в ходок зависимости. Также известно, что он ломается при работе с загруженными параллельно библиотеками DLL.

В twpol / vmmap есть реализация командной строки с открытым исходным кодом, похожая на VMMap, и она успешно отображает всю ту же информацию о процессе, которую выполняет SysInternals VMMap.

Смотрите также этот форк, который реализует быстрое перечисление кучи, но я лично не тестировал этот.

Другие вопросы по тегам