【问题标题】:How do I get the information shown in vmmap programatically?如何以编程方式获取 vmmap 中显示的信息?
【发布时间】:2013-05-02 16:17:40
【问题描述】:

任何看过 Mark Russovich 演讲“揭示内存管理之谜”的人都知道,vmmap 工具可以向您显示一些其他工具似乎不知道的与您的进程限制(香草 32 位窗口上为 2GB)有关的东西.

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

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

我所知道的事情 (AFAIK) 并不能完全为您提供完整的图片:

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

【问题讨论】:

  • 你看VirtualQueryVirtualQueryEx了吗?
  • @RogerRowland 不,我不知道这些。看起来很有希望,谢谢。
  • 好的 - 我使用依赖遍历器查看 vmmap.exe 导入了哪些 WinApi 函数 - 有用的工具 - dependencywalker.com
  • @RogerRowland Neat,我知道dependencywalker,但不知道它可以追溯到api函数。如果您想将其放入答案中,我会接受。

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


【解决方案1】:

我使用Dependency Walker 查看vmmap.exeKernel32.dll 导入了哪些Windows API 函数,发现以下可能相关的函数:

VirtualAlloc
VirtualAllocEx
VirtualFree
VirtualProtectEx
VirtualQueryEx

看看这些,看看你能不能找到vmmap 在做什么。当然,任何其他动态进行的 API 调用(即通过LoadLibrary)都不会出现在依赖项遍历器中。在处理并行加载的 DLL 时,它也会被破坏。

【讨论】:

    【解决方案2】:

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

    另见this fork,它实现了快速堆枚举,但我没有亲自测试过这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 2011-03-27
      • 2018-01-06
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多