2016-05-03 20 views
1

有没有一种方法可以获取有关我的应用程序正在使用的虚拟内存的信息?关于我的程序正在使用的虚拟内存的信息?

据我所知也有一个程序使用内存若干段,如代码段,数据段和堆,栈等

有没有一种方法,我可以得到的信息地址在哪里开始和结束?

为了给出一些上下文,我试图绘制一个包含我的程序(一种图形)的虚拟内存的视觉表示的图像。所以我需要不同片段的开始和结束地址,并且如果可能的话,确定地址是否为内存的方式目前正在使用。

我在windows btw上使用C++。

+0

我记得我的教授编写了一个程序,它捕获SIGSEGV,然后访问地址为4kBs左右的地址。这只会给你提供哪些地址可读的信息,我不知道它如何在Windows上工作。 –

+0

你需要更具体的你正在寻找什么。如果您使用的是32位Windows,则使用2^32字节的虚拟内存。如果您在64位窗口中,则使用2^64字节的VIRTUAL内存(甚至是逻辑内存)。你在谈论工作集的大小吗?有多少逻辑页面已被映射? – user3344003

+0

在语言层面上没有什么可以确定这一点。您必须使用特定于操作系统的库来查询您的操作系统状态和进程的状态。 –

回答

1

您可以通过调用VirtualQueryEx来查询进程的内存布局。 它返回你想要的内存映射布局。

返回的MEMORY_BASIC_INFORMATION表的内存部分列表及其保护属性。

然而,在机器上的保护工作属性不是由它的性质(代码,数据RODATA,BSS,堆等),你只能他们猜测

  • PAGE_EXECUTE:代码
  • PAGE_READONLY:RODATA
  • PAGE_READWRITE:数据,BSS,堆,栈
  • PAGE_WRITECOPY:数据,BSS,堆,栈

但是,如果进程自己定制了VirtualAllocate或文件映射,以上猜测将不可靠,为了提高准确性,您还可以用GetModuleFileName查询可执行文件名并解析文件,然后与表进行比较(注意地址空间随机化)

+0

谢谢,你有任何如何使用它的例子?当我使用它时,它返回的信息不是很有用吗?任何帮助表示赞赏。 –

相关问题