c++ - 有关我的程序正在使用的虚拟内存的信息?

标签 c++ windows memory virtual-memory

有什么方法可以获得有关我的应用程序正在使用的虚拟内存的信息?

据我所知,程序使用的内存有几个段,例如代码段、数据段和堆、栈等。

有没有办法获取有关这些段开始和结束的地址的信息?

为了提供一些上下文,我正在尝试绘制一个图像,其中包含我的程序的虚拟内存的可视化表示(一种图形)。所以我需要不同段的开始和结束地址,如果可能的话,我需要一种方法来确定一个地址是否是当前正在使用的内存。

顺便说一句,我在 Windows 上使用 C++。

最佳答案

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

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

但是,机器根据其性质(代码、数据、rodata、bss、堆等)处理保护属性,您只能猜测它们:

  • PAGE_EXECUTE:代码
  • PAGE_READONLY: rodata
  • PAGE_READWRITE:数据、bss、堆、栈
  • PAGE_WRITECOPY:数据、bss、堆、栈

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

关于c++ - 有关我的程序正在使用的虚拟内存的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37009927/

相关文章:

c++ - 如何在 Linux 中启用 C++11

c++ - 专门针对 const 成员函数指针

linux - 为什么因为内存而选择linux而不是windows?

windows - Windows Batch 上的最大变量数

Java,指向内存中同一个对象的引用变量

java - swisscom cloud foundry spring boot app内存不足

C++ 我应该重载运算符吗?

c++ - 3 channel 图像上的OpenCV CUDA拉普拉斯滤波器

linux - 发送大量UDP数据包时如何减少系统调用开销? (Windows 和 Linux)

memory - 具有手动内存管理功能的解释型语言?