1

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

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

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

4

1 回答 1

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;
}

很恶心,但它确实可以防止我的代码崩溃。

于 2008-10-12T02:25:08.440 回答