gcc选项 -fstack-usage 为每一个函数输出栈使用信息

本文介绍了如何在C代码中使用-fstack-usage参数生成堆栈使用信息的.su文件,展示了Makefile示例,并讨论了实际项目中合并su文件的方法,以及关于动态栈、递归函数、内联函数和编译优化对栈使用的影响和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参数

CFLAGS += -fstack-usage -Wstack-usage=1024

介绍

参数-fstack-usage用于生成.su文件(Stack Usage文件),这些文件包含了编译的每个函数使用的栈空间的信息。

参数-Wstack-usage=SIZE用于检查函数使用的栈空间是否超过了指定的SIZE字节。如果超过了,编译器会发出警告。

示例

代码

#include <stdio.h>

void largeStackUsage()
{
    char largeArray[2048];
    for (int i = 0; i < sizeof(largeArray); i++)
    {
        largeArray[i] = (char)(i & 0xFF);
    }
    printf("Finished using a large stack\n");
}

int main()
{
    largeStackUsage();
    return 0;
}

Makefile

在Makefile中添加-O0来禁止优化

TARGET := stack_usage
#CROSS_COMPILE = arm-linux-gnueabihf-
STRIP = $(CROSS_COMPILE)strip
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar

CFLAGS += -O0 -Wall -std=gnu99
CFLAGS += -g -Wstack-usage=1024 -fstack-usage

OBJS += main.o  

all: $(TARGET)
$(TARGET):$(OBJS)
	$(CC) -o $@ $^ $(LDFLAGS)
    
clean:
	-rm $(OBJS) $(TARGET) -f

结果

编译产生的警告

gcc -O0 -Wall -std=gnu99 -g -Wstack-usage=1024 -fstack-usage   -c -o main.o main.c
main.c: In function ‘largeStackUsage’:
main.c:3:6: warning: stack usage is 2096 bytes [-Wstack-usage=]
    3 | void largeStackUsage()
      |      ^~~~~~~~~~~~~~~
gcc -o stack_usage main.o 

su文件

main.c:3:6:largeStackUsage	2096	static
main.c:13:5:main	16	static

实际项目中运用

数据整理

将当前目录下各个子目录的su文件整合到一个文件中

find . -name "*.su" -exec cat {} \; > combined.txt

打开Excel,选择数据选项卡-自文本-选择combined.txt文件
分隔符号选择Tab键和其他 : 号
在这里插入图片描述
将栈空间列选中-排序
在这里插入图片描述

限制

在某些情况下可能无法提供完全准确的栈使用信息。以下是一些可能的限制和例子:

  1. 动态栈使用:-fstack-usage主要报告的是静态栈使用情况,也就是编译时可以确定的栈大小。对于动态分配的栈空间(例如,函数中的alloca调用或变长数组)无法准确报告实际的栈使用量。
  2. 递归函数:对于递归函数,-fstack-usage只能报告单次调用的栈使用情况。如果一个函数递归调用自身多次,实际的栈使用量将远大于-fstack-usage报告的数量。
  3. 内联函数:对于内联函数,-fstack-usage可能无法准确报告栈使用情况。因为内联函数的代码直接插入到调用它的函数中,所以它的栈使用实际上被包含在调用函数的栈使用中。
  4. 优化:编译器优化可能会影响栈使用情况。例如,尾调用优化可以减少栈使用,而其他优化可能会增加栈使用。-fstack-usage可能无法准确反映这些优化的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值