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

时间:2014-01-17 00:40:54

标签: c++ c linux winapi memory-management

我经历了this blogthis videocast。在Windows中,如果我想检索有关指定进程的虚拟地址空间内的一系列页面的信息,我可以使用WinAPI VirtualQueryEx method

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文件时,我经历了this thread。这是好方向吗?应该如何看待与此处提供的最接近的实现,但是对于Linux?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

据我所知/proc/<pid>/maps是唯一可靠且受支持的方式。{p>甚至libunwind is using it

  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;