当前位置:网站首页>一种简单通用的获取函数栈空间大小的方法
一种简单通用的获取函数栈空间大小的方法
2022-07-29 03:11:00 【星沉地动】
有些时候我们需要评估某个函数所使用的栈空间大小,比如创建线程的时候,我们需要估算该线程函数所需的栈空间,分配合适的线程栈。
本文介绍一种简单的方法,来获取某个函数所占用的栈空间大小。
原理:
针对递减栈内存模型,调用函数时,栈指针会往下移动,移动的距离取决于该函数的局部变量和调用子函数,也就是该函数所使用的栈空间,在函数返回时,栈指针又会恢复到调用前的位置。
根据这一特性,我们可以在调用函数前把栈底部的内存用一个特定值来填充,调用结束后检查栈底部的值是否发生变化,搜索到最后1个发生变化的地址就是该函数所使用的栈底。用当前栈指针减去栈底指针就能算出该函数实际使用的栈空间大小。
实施:
废话不多说,直接上测试代码:
//用0xAA填充栈底512字节
void stack_test_begin(void)
{
register int i;
unsigned char mem[512];
for(i = 0; i < 512; i++)
{
mem[i] = 0xAA;
}
}
//检查栈底,返回栈大小
int stack_test_end(void)
{
register int i;
unsigned char mem[512];
for(i = 0; i < 512; i++)
{
if(mem[i] != 0xAA)
{
return 512 - i;
}
}
return 0;
}
//被测试函数, 此函数理论占用栈空间为128字节
void stack_use_128(void)
{
register int i;
char mem[128];
for(i=0; i<128; i++)
{
mem[i] = 0;
}
}
//测试
void main(void)
{
int stack_size;
stack_test_begin();
stack_use_128();
stack_size = stack_test_end();
printf("stack: %d\n", stack_size);
}
代码解读:
为方便分析,假设main函数的初始栈指针为SP=0x00001000。
1. 调用stack_test_begin() ,这个函数局部变量mem占用512字节,这512字节用0xAA填充,实际就会导致0x00000E00 - 0x00001000被填充为0xAA。这就完成了我们栈底填充特定值步骤。
2. 调用stack_use_128(),这个函数是我们想要获取栈空间的目标函数,这个函数对局部变量的操作,会导致我们填充的0xAA变为其它值。
3.调用stack_test_end(),这个函数同样使用512字节的局部变量,我们搜索这512字节空间,从前往后找,找到不是0xAA的值,就表示此处是被stack_use_128()函数使用的栈边界。此边界之前是未用到的栈内存,因此用512减去此边界值就是该函数实际使用的栈空间大小。
4.如果被测函数栈空间超过512,则需要把512改为更大的值,增加更多的填充深度。
总结:
此方法在ARM和x86平台上测试能正常工作。不依赖系统调用,通用性较强。
但填充内存和搜索内存会消耗CPU资源,影响整体性能,因此只适合在代码调试阶段使用。
完
边栏推荐
- 生产部署zabbix5.0笔记
- 爆肝整理JVM十大模块知识点总结,不信你还不懂
- C语言基础知识点汇总
- Feedback function of conference OA
- C and pointer Chapter 3 semantic "trap" 3.5 null pointer is not a string
- C traps and defects Chapter 3 semantic "traps" 3.2 pointers to non arrays
- 力扣刷题之数组序号计算(每日一题7/28)
- 融云 IM & RTC 能力上新盘点
- 「PHP基础知识」输出圆周率的近似值
- 《QA离业务代码能有多近?》通过codediff直接暴露缺陷
猜你喜欢
随机推荐
Principle knowledge is useful
Score addition and subtraction of force deduction and brushing questions (one question per day 7/27)
MYSQL入门与进阶(十三)
C traps and defects Chapter 3 semantic "traps" 3.9 integer overflow
C陷阱与缺陷 第3章 语义“陷阱” 3.4 避免“举偶法”
Engineering boy: under 20 years old, ordinary but not mediocre
HTB-Blocky
sqlilabs less-32~less-33
融云实时社区解决方案
SAP 中国本地化内容汇总
mycat读写分离配置
MYSQL入门与进阶(十四)
Unable to start after idea installation
Flask的创建的流程day05-06之创建项目
第09章_性能分析工具的使用
C traps and defects Chapter 3 semantic "traps" 3.3 array declaration as parameters
[freeswitch development practice] media bug obtains call voice flow
C语言基础知识点汇总
vasp计算任务报错:M_divide:can not subdivide 8 nodes by 6
C traps and defects Chapter 3 semantic "traps" 3.2 pointers to non arrays









