【问题标题】:How can you efficiently check the VM mapping for an address?如何有效地检查地址的 VM 映射?
【发布时间】:2010-09-16 17:32:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux memory-management


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 2016-11-29
      • 1970-01-01
      • 2018-01-09
      • 2015-05-02
      • 2021-09-01
      • 2012-12-25
      • 2011-11-24
      • 2013-05-03
      相关资源
      最近更新 更多