作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试估计程序堆栈范围的跨度。我的策略是假设由于堆栈向下增长,我可以为当前堆栈帧创建一个局部变量,然后使用其地址作为引用。
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
有人可以帮我理解我哪里出了问题吗?提前致谢!
最佳答案
这种方法大多有效;您的错误只是在同一调用框架中检查 a
和 b
。编译器没有理由按照您在堆栈上期望的方式对自动变量进行排序;它可能会出于数据局部性或对齐目的选择它们的顺序。
如果您比较 main
中的一个自动对象的地址和单独调用框架中的另一个自动对象的地址(确保它不会内联到 main
中!),那么您应该得到更接近您期望的结果。
关于c - 如何检测程序虚拟空间中的栈顶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14617515/
我是一名优秀的程序员,十分优秀!