问题标签 [vmmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
956 浏览

c# - 使用来自 vmmap 的私有数据地址,我如何找出其中的内容?

在此处输入图像描述

我有一个 Windows 进程,它的虚拟大小对于它的功能来说太大了(26gb) 我使用 VMMap 来绘制内存的布局方式,并且我已经获得了私有数据的地址,该地址显示为保留.

我如何查看里面的内容?有没有可能

0 投票
2 回答
1531 浏览

windows - 如何以编程方式获取 vmmap 中显示的信息?

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

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

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

我所知道的事情(AFAIK)并没有给你完整的画面:

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

windbg - 为什么 windbg> !EEHeap -gc 显示的托管堆比 VMMAP.exe 小得多?

我有一个 C# 应用程序,其内存使用量会随着时间的推移而增加。我已经定期进行用户模式转储,并在加载 sos 后,运行 !EEHeap -gc 来监控托管堆大小。在 windbg/sos 中,我看到它从 14MB 开始增长到 160MB,然后缩小到 15MB,但应用程序“Private Bytes”从未显着减少。我已经确定了导致“私有字节”增加的活动,因此我可以控制何时发生内存增长。

我尝试运行 Vmmap.exe 并注意到它报告了大约 360MB 的托管堆,快速转储并使用 windbg/sos/eeheap -gc 我只看到 15MB。

为什么我会看到如此不同的价值观?托管堆真的是 vmmap.exe 报告的吗?

如何在 windbg 中检查托管堆的这个区域?

0 投票
1 回答
605 浏览

windows - 为什么 Windows 任务管理器和 VMMap 显示不同的内存使用情况?

我正在分析服务器应用程序,用 Delphi7 编写,在 Windows Server 2003 R2 Standard Edition SP2 上运行。需要检查它何时耗尽内存。任务管理器和 SysInternals VMMap 中显示的内存使用情况不同。为什么?有什么建议,链接吗?任务管理器:“Mem Usage”是根据 do Help 的 Working Set,“VM Size”是 Committed memory。

所以在任务管理器中我已经提交了 801 MB 内存,但在 VMMap 877 中 - 76 MB 有什么区别?

内存使用:Win 任务管理器 vs VMMap

0 投票
1 回答
471 浏览

c++ - 如何找到内存泄漏?

我在 MFC 中创建了一个应用程序。运行我的应用程序 18 小时后,该过程达到了 2.5 GB 的内存使用量。我已经尝试使用 VMMap 来找出内存泄漏。但它只提供高级数据。

是否有任何工具可以让我从转储文件中获取内存泄漏,或者是否可以使用 VMMap 找出内存泄漏的来源。

0 投票
2 回答
4924 浏览

c# - VMMAP 中的“私有数据”定义了什么?

我正在使用 VMMap 分析混合模式(托管和非托管)应用程序中的虚拟/进程地址空间利用率。我了解 Windows VMM 和虚拟内存 API 的工作原理,我也了解堆内存 API 的工作原理。我已经查看了我正在使用的 CRT 实现(不是很详细)并且(我想我 - 这可能是我的失败)了解它如何使用上述 Win32 API。

我希望了解这个“私人数据”统计数据向我展示了什么。我的应用程序没有直接调用任何 Win32 内存 API 函数,它只在本机 C++ 中使用“malloc/new”,在 C# 中使用“new”(深入使用 Win32 内存管理 API)。

VMMap 给出的“Private Data”的定义是:

私有内存是由 VirtualAlloc 分配的内存,而不是由堆管理器或 .NET 运行时分配的内存。它不能与其他进程共享,根据系统提交限制收费,并且通常包含应用程序数据。

所以我想这个定义让我问,好吧,那么是谁在调用 VirtualAlloc?是堆管理器还是 .Net 运行时?

我可以获取一些已提交的私有数据的地址并使用 WinDbg 来找出......嗯......事实证明,微软在他们的智慧中已经提高了 ntdll 公共符号,所以 WinDbg 不能很好地工作 - 我如果需要,可以提供更多详细信息,但基本上像 !address -summary 这样的命令由于缺少符号而不再起作用。

这个问题的另一种说法可能是:我可以编写哪些 C++ 或 C# 代码来导致该私有数据统计量增加或减少?还是这一切都由操作系统、C++ 运行时或 .Net 运行时管理,因此任由其一时兴起?

我可以从 VMMap 的性质(其他内存类型是互斥的)推断出这种“私有数据”,因此不能是以下任何类型的地址空间:

  • 堆(请注意,这包括已提交和保留的堆空间 - 通过调用 VirtualAlloc 保留,如上面私有数据的描述中所述)。
  • 托管堆
  • 可分享
  • 映射文件
  • 图片
  • 页表
  • 无法使用
  • 自由的

(我找不到定义 VMMap 认为上述所有类型的在线帮助文​​件,但这里有一个下载帮助文件的链接:https ://technet.microsoft.com/en-us/library/dd535533.aspx )

我注意到在我的应用程序中,私有数据的总(保留和提交)大小在我的应用程序生命周期中保持相当稳定,尽管堆/托管堆/堆栈大小按预期变化。我还注意到,在私有数据使用的约 250Mb 总量中,实际上只有约 33Mb 被提交。请注意,我的测量方法相当初级,因此值可能在我的每次测量之间发生变化,而我只是没有看到它(如果我知道这是在测量什么,我可以使用 DebugDiag 来获取进程的转储相关计数器达到一定的阈值,鸡和蛋)。

我目前的推测理论是,这是保留的空间,用于在本地(或我想是管理的?)堆达到其容量时增长,但我没有任何证据可以证明这一点。所以它仍然牢牢地留在投机堆中。

在互联网上搜索这方面的详细信息可能会很痛苦,那里有很多令人困惑的帖子/文章/博客,使用自引用定义(Performance Monitor 对工作集的定义的第一句就是一个很好的例子),是不完整或完全错误。许多地方模糊了定义或使用了不一致的术语(请注意,VMMaps 对字段私有数据的定义,继续将其称为私有内存,也许有点像肛门抱怨,但模棱两可)。

既然我已经批评互联网的其他部分让事情变得混乱和不正确...... ,让我知道,我也会把自己列入罪犯名单!我认为尝试在网上向某人解释记忆问题的前半部分是确保我们都在谈论同一件事。

最后这个问题:VMMap 如何知道给定的内存区域是线程堆栈,具体来说?建议我可能永远找不到答案:/

更新/编辑:我发现通过打开 gflags 用户堆栈跟踪(gflags -i myapp.exe +ust),您可以增加私有数据的大小,我假设这是回溯数据库,但即使没有 gflags ,仍然有我正在努力解释的私人数据。

0 投票
1 回答
1308 浏览

macos - 命令 vmmap 是否有任何 API

在命令行中,我可以使用vmmap -v -purge 50554查找进程 50554 的内存信息,并得到如下输出:

但是有没有我可以调用实现相同功能的 API?

0 投票
1 回答
365 浏览

c - 使用 dtruss 捕获 Mach 系统调用

我在 vmmap 上运行 dtruss,这是一个读取另一个远程进程的虚拟内存的进程。

我希望某些 mach_port 系统调用会出现在我的命令的输出中,但无法跟踪任何(即 mach_vm_read、task_for_pid 等..)

我运行的确切命令(注意 dtruss 是 OS-X 中 dtrace 的包装脚本):

vmmap 的输入参数只是任何正在运行的进程的 pid,我使用的操作系统版本是 10.10(在 10.11 中,在 vmmap 等苹果产品上运行 dtruss 时存在授权问题)。

也许有人可以告诉我如何识别我正在寻找的系统调用......我应该在 dtruss 输出中寻找明确的名称,还是只是我想要的系统调用的通用调用号(遗憾的是,我还没有找到任何他们) :

0 投票
1 回答
698 浏览

c - 在 XNU 项目中找到 __proc_info 符号

我想弄清楚 VMMAP 进程是如何运作的。

使用 dtrace 运行此可执行文件后,似乎是提取虚拟内存中每个部分的地址空间的方法 proc_regionfilename。

所以,我挖得更深了,在 xnu 中的
libsyscall/wrappers/libproc/libproc.c文件下找到了它的实现

在函数体中,我看到主要调用是 proc_pidinfo :

而 proc_pidinfo 又调用 __proc_info 符号:

但是,在代码中找不到这个符号,我想知道它是如何在预编译、编译、链接或实时过程中创建的。

知道我在哪里可以找到它,或者它是如何创建的(我还没有尝试编译内核)。

谢谢

0 投票
0 回答
36 浏览

c - 为什么程序的虚拟地址范围不可读、不可写或可执行?

当我通过查看来探索 bash 程序使用的虚拟内存地址范围时/proc/bash_pid/maps,我发现某些虚拟地址范围不可读、不可写或可执行。例如,

我的问题是:

如果这样的虚拟地址不可读、不可写或可执行,程序为什么需要它?

虽然它显示该地址区域链接到某个共享库,但在我看来,这些地址区域对程序根本没有用。

以下是 /proc/pid/maps 的完整输出