栈信息统计

局部变量和函数调用关系都需要保持在栈,如果局部变量过大,或函数调用关系过深(递归或者嵌套调用)则很容易导致栈异常。程序需要使用的栈空间大小,可以在程序编译时就确认。下面列举RVCT和GCC两种编译器查看栈信息的方法,其他编译器也有类似的功能。

RVCT

armlink最后链接程序时,使用-callgraph参数。

-callgraph 该选项创建一个HTML格式的静态函数调用图。这个调用图给出了映像文件中所有函数的定义和引用信息。对于每一个函数它列出了:
    1. 函数编译时候的处理器状态(ARM状态还是Thumb状态); 
    2. 调用func函数的集合;
    3. 被func调用的函数的集合;
    4. 在映像文件中使用的func寻址的次数。
    此外,调用图还标识了下面的函数:
    1. 被interworking veneers所调用的函数;
    2. 在映像文件外部定义的函数;
    3. 允许未被定义的函数(以weak方式的引用);
    静态调用图还提供了堆栈使用信息,它显示出了:
    1. 每个函数所使用的堆栈大小;
    2. 在全部的函数调用中,所用到的最大堆栈大小。

栈信息统计_第1张图片

通过这个html文件可以看出程序最大使用的栈空间,以及栈调用最深的调用链。

GCC

gcc编译源码时添加-fstack-usage选项,生成obj文件时,同时会生成su文件。su文件中包含了obj文件中说有函数的栈使用量。

在这里插入图片描述

文件内容如下:

main.c:36:6:bar    48    static
main.c:41:5:foo    88    static
main.c:47:5:main    8    static

该功能的一个缺点就是,只能统计单个函数的栈使用量。统计整个函数调用链的栈使用量则需要自己整理出调用链关系。

使用-Wstack-usage参数,可以在栈容量超过阈值后给出警告。

 

 

你可能感兴趣的:(ARM嵌入式底层软件开发)