如何判断一个内存地址属于进程的哪一段?

先打印出某个地址,然后阻塞(getchar())进程,查一下进程的 id,然后执行Linux 命令pmap {pid} 查看进程的空间布局(MAC 使用vmmap {pid}),将之前打印的地址对应到某一段。

using namespace std;
#define FUCK(x) cout << (#x) << ": " << x << endl<< endl;
#define FUCKK(x, y) cout << (#x) << ": " << x << endl << (#y) << ": " << y << endl<< endl;
#define FUCKKK(x, y, z) cout << (#x) << ": " << x << endl << (#y) << ": " << y << endl << (#z) << ": " << z << endl<< endl;

class A {
    void virtual f(){}
};
class B : A{};

void f() {}

int main()
{
    B a;
    void *vptr = *(void**)&a;
    void *vf = **(void***)&a;
    int b = 10;
    int *p = new int(10);
    FUCKK(&b, p)
    FUCKK(vptr, vf)
    FUCK((void*)f)
    getchar();
    return 0;
}


可以看到

  • &b 是局部变量,对应倒数第 4 个段(stack)权限是可读可写
  • p是堆变量,对应第六个段,也是可读可写
  • 虚函数表vptr在第 4 个段,只读
  • 虚函数vf和普通函数f 都在第 2 个段,可读可执行
posted @ 2024-04-15 14:20  hellozhangjz  阅读(5)  评论(0编辑  收藏  举报