如何检测程序虚拟空间中堆栈的顶部

我试图估计我的程序堆栈范围的跨度。 我的策略是假设自堆栈向下增长后,我可以为当前堆栈框架创建一个局部变量,然后将其地址用作参考。

 int main()
 {
   //Now we are in the main frame.
   //Define a local variable which would be lying in the top of the stack
    char a;
   //Now define another variable
    int b; //address should be lower assuming stack grows downwards

   //Now estimate the stack size by rlimit
   struct rlimit stack_size;
   getrlimit(RLIMIT_STACK,&stack_size);

   //A crude estimate would be stack goes from &a to &a - stack_size.rlim_cur

   printf("%p n",&a);
   printf("%p n",&b);
   printf("stack spans from %u to %u",&a,&a - stack_size.rlim_cur);
   return 0;
 }

有趣的是,当我使用gdb调试a和b的值地址时,b的地址值比a值高。 堆栈指针也总是保持在同一个地方。

 0xbfca65f4 
 0xbfca660f
 Stack spans from 0xbfca65f4 to 0xbbca65f4.

 ebx            0xb7faeff4  -1208291340
 esp            0xbffff670  0xbffff670

任何人都可以帮我理解我要出错的地方吗? 提前致谢!


这种方法大多有效; 你的错误只是在同一个呼叫帧中检查ab 。 编译器没有理由按照您期望的方式自动定义变量; 它可能会选择他们的数据位置或对齐目的的顺序。

如果你在一个单独的调用框架中比较main和one中的一个自动对象的地址(确保它不是可能被内联到main ),那么你应该得到更接近你期望的结果。

链接地址: http://www.djcxy.com/p/80287.html

上一篇: How to detect the top of the stack in program virtual space

下一篇: Segmentation fault: Stack allocation in a C program in Ubuntu when bufffer>4M