C语言中,如何根据指针获取内存段?

3

能否根据指针/立即地址值获取内存段?

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"

如果我没有弄错的话,那些只是标签。这个看起来相关: https://dev59.com/nHI-5IYBdhLWcg3wlpeW - user3738848
1个回答

0

您可以读取/proc/self/maps以查看进程的内存布局详细信息。C库有一个符号,指示堆的开始。在glibc中,它被称为_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";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接