有什么方法可以获得有关我的应用程序正在使用的虚拟内存的信息?
据我所知,程序使用的内存有几个段,例如代码段、数据段和堆、栈等。
有没有办法获取有关这些段开始和结束的地址的信息?
为了提供一些上下文,我正在尝试绘制一个图像,其中包含我的程序的虚拟内存的可视化表示(一种图形)。所以我需要不同段的开始和结束地址,如果可能的话,我需要一种方法来确定一个地址是否是当前正在使用的内存。
顺便说一句,我在 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/