C,获取给定指针的内存段

时间:2014-06-08 14:24:41

标签: c gdb

是否可以在给定指针/移动地址值的情况下获取内存段。

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"

1 个答案:

答案 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";
}