代码之家  ›  专栏  ›  技术社区  ›  Nicholas Riley

如何有效地检查VM映射中的地址?

  •  1
  • Nicholas Riley  · 技术社区  · 16 年前

    我正在编写一个跟踪工具,它需要处理JIT的输出,因此堆栈有时看起来非常奇怪。我想尝试对地址应用一些启发式方法,以确定它们是代码、数据还是垃圾。(如果有时我错了,那也没什么大不了的;但是如果流程崩溃了,也没什么大不了的。)

    我可以 cat /proc/«pid»/maps 获取Linux中进程的VM映射列表。是否可以从流程内部访问此信息(或任何子集),而无需解析该文件?最好是检查一下房间 rwx mprotect(2) .

    如果我不能做到这一点,那么确定访问某个地址是否会导致分段错误如何?(已经有一个 SIGSEGV 在本例中安装了处理程序,我无法轻松覆盖它,否则我只会这样做。)

    1 回复  |  直到 16 年前
        1
  •  2
  •   Nicholas Riley    16 年前

    通过查看所有与内存相关的函数,我发现我可以使用 munlock() 以确定页面是否有效。

    bool is_address_valid(ADDRINT addr) {
      static int pagesize = getpagesize();
    
      const void *foo = (const void *)(addr / pagesize * pagesize);
    
      if (munlock(foo, 1) == -1) {
        fprintf(stderr, "munlock(%p=>%p, 1) failed: %s\n", addr, foo,
                strerror(errno));
        return false;
      }
      return true;
    }