【问题标题】:VirtualQueryEx alternative for Linux - how to get virtual memory range of another processLinux 的 VirtualQueryEx 替代方案 - 如何获取另一个进程的虚拟内存范围
【发布时间】:2014-02-06 04:28:57
【问题描述】:

我经历了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?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      据我所知,/proc/<pid>/maps 是唯一可靠且受支持的方法。甚至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;
      

      【讨论】:

        猜你喜欢
        • 2011-05-23
        • 2016-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 2015-08-16
        相关资源
        最近更新 更多