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

时间:2008-10-12 00:24:38

标签: linux memory-management

我正在编写一个需要处理JIT输出的跟踪工具,因此堆栈有时看起来很奇怪。我想尝试将一些启发式方法应用于地址,以确定它们是代码,数据还是垃圾。 (如果我在某些时候错了,那没关系;但是如果这个过程崩溃了,那就不那么重要了。)

我可以cat /proc/«pid»/maps获取Linux中进程的VM映射列表。是否可以从流程内部访问此信息(或任何子集)而无需解析该文件?检查地址的rwx位是理想的。基本上,我想要mprotect(2)的“阅读”版本。

如果我不能这样做,如何确定访问某个地址是否会导致分段错误? (在这种情况下已经安装了SIGSEGV处理程序,我无法轻易覆盖它,或者我只是这样做。)

1 个答案:

答案 0 :(得分:2)

查看我发现的所有与内存相关的函数,我可以使用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;
}

非常恶心,但确实会阻止我的代码崩溃。