如何以编程方式获取地图中显示的信息?

时间:2013-05-02 16:17:40

标签: windows visual-c++ operating-system virtual-memory vmmap

任何看过Mark Russovich谈论“内存管理之谜”的人都知道,vmmap工具可以向你显示与你的进程限制相关的东西(在32位窗口上2GB),其他工具似乎并不知道

我希望能够以编程方式监控我的真实总内存大小(与进程限制密切相关的大小),这样我至少可以记录当我接近进程限制时发生的事情。有没有关于vmmap如何做到这一点的公开信息?

...另外,为什么这些信息难以获得?

我所知道的事情(AFAIK)并没有完全说明你的全貌:

  • :: GetProcessMemoryInfo看起来只返回有关私有内存使用情况的信息
  • System.Diagnostics.Process.VirtualMemorySize64返回一个相当大的数字,仍然与vmmap显示的总数不完全匹配 - 实际上它与vmmap中显示的ANYTHING不匹配:(

2 个答案:

答案 0 :(得分:2)

我使用Dependency Walker查看Kernel32.dllvmmap.exe导入了哪些Windows API函数,并找到了可能相关的以下函数:

VirtualAlloc
VirtualAllocEx
VirtualFree
VirtualProtectEx
VirtualQueryEx

看看那些,看看你是否能找到vmmap正在做的事情。当然,动态制作的任何其他API调用(即通过LoadLibrary)都不会出现在依赖性walker中。在处理side-bys-de加载的DLL时,它也会被打破。

答案 1 :(得分:1)

twpol/vmmap中有一个类似于VMMap的功能的开源命令行实现,它成功显示了与SysInternals VMMap所做的过程相同的所有信息。

另请参见this fork,它实现了快速堆枚举,但是我还没有亲自测试过这一点。