如何判断一个内存地址属于进程的哪一段?
先打印出某个地址,然后阻塞(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 个段,可读可执行。