是否可以在给定指针/移动地址值的情况下获取内存段。
GDB中是否有可用的解决方案? 如果不是,自定义gcc(非可移植)功能实现也应该是好的。
前:
int data = 100;
int main(void) {
int ldata = 100;
int *hdata = malloc(10 * sizeof(int));
}
getMemSeg(&data) should return "DATA"
getMemSeg(&ldata) should return "STACK"
getMemSeg(hdata) should return "HEAP"
答案 0 :(得分:0)
您可以阅读/proc/self/maps
以查看流程内存布局的详细信息。 C库有一个符号,表示堆的开头。在glibc中,它是calles _end
。并且堆栈中的任何内容总是低于当前堆栈帧中的任何内容(至少在x86和堆栈向下增长的其他处理器中)。因此,至少对于一个简单的程序,这些启发式方法可以起作用:
extern int _end;
const char* getMemSeg(void* p){
int stackframe;
if(p>(void*)&stackframe)
return "STACK";
if(p<(void*)&_end)
return "DATA";
return "HEAP";
}