Linux的VirtualQueryEx替代方案-如何获得另一个进程的虚拟内存范围

VirtualQueryEx alternative for Linux - how to get virtual memory range of another process

本文关键字:另一个 何获得 进程 虚拟内存 范围 VirtualQueryEx 方案 Linux      更新时间:2023-10-16

我浏览了这个博客和这个视频广播。在Windows中,如果我想检索指定进程的虚拟地址空间内的一系列页面的信息,我可以使用WinAPIVirtualQueryEx方法:

MEMORY_BASIC_INFORMATION meminfo;
unsigned char *addr = 0;
for(;;)
{
if(!VirtualQueryEx(hProc, addr, &meminfo, sizeof(meminfo)))
break;
if(meminfo.State & MEM_COMMIT)
{
//collect some data from meminfo
}
addr = (unsigned char*)meminfo.BaseAddress + meminfo.RegionSize;
}

我想知道如何使用系统调用在Linux中获得类似的信息集,但我不清楚如何使用C/C++在Linux下收集这样的数据。当有人建议查看/proc/<pid>/mem/proc/<pid>/maps文件时,我浏览了这个线程。方向好吗?除了Linux之外,最接近这里提供的实现应该是什么?

是的,proc文件系统是Linux API的一部分,所以这就是我们要做的。该文件系统中的许多数据通常是使用库包装器访问的,但这就是数据所在的位置。

据我所知,/proc/<pid>/maps是唯一可靠且受支持的方法。甚至libunwind也在使用它:

if (maps_init (&mi, getpid()) < 0)
return -1;
unsigned long offset;
while (maps_next (&mi, &low, &hi, &offset)) {
struct dl_phdr_info info;
info.dlpi_name = mi.path;
info.dlpi_addr = low;
相关文章: