我正在尝试估算程序堆栈范围的范围。我的策略是假设自从堆栈向下增长,我可以为当前堆栈帧创建一个局部变量,然后使用其地址作为参考。
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
任何人都可以理解我哪里出错了吗? 提前谢谢!
答案 0 :(得分:2)
这种方法大多有效;您的错误只是在同一个调用框架中检查a
和b
。编译器没有理由按照预期的方式对自动变量进行排序;它可能会选择他们的订单用于数据位置或对齐目的。
如果你比较main
中的一个自动对象的地址和另一个单独的调用框架中的另一个自动对象的地址(确保它不是可能被内联到main
中的那个!)那么你应该得到更接近的结果你期待什么。