You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何剖析C程序的栈大小?附Valgrind Massif实践案例

栈大小剖析方案(针对无堆使用的C程序)

需求

我正在优化一个未使用堆的C程序,需要剖析栈大小以明确以下信息:

  • 栈的实际规模
  • 栈的峰值出现位置
  • 栈大小的变化趋势
  • 栈峰值及大小变化对应的代码位置

已尝试的方法

我使用Valgrind的Massif工具进行分析,命令为 valgrind --tool=massif --stacks=yes ./program,以下是Hello World示例:

示例C代码

#include <stdio.h>

int main()
{
    int input;

    scanf("%d", &input);

    if (input == 1)
    {
        printf("Hello world\n");
    }
    else
    {
        printf("Goodbye world\n");
    }
    return 0;
}

(注:原代码中void main不符合C标准,已改为标准的int main并添加返回值)

编译命令

gcc -o main main.c

运行结果

buba98@buba-laptop:~/projects$ valgrind --tool=massif --stacks=yes ./main
==18236== Massif, a heap profiler
==18236== Copyright (C) 2003-2017, and GNU GPL'd, by Nicholas Nethercote
==18236== Using Valgrind-3.21.0 and LibVEX; rerun with -h for copyright info
==18236== Command: ./main
==18236== 
1
Hello world
==18236== 

问题解决与详细分析步骤

运行后仅得到程序输出,未直接展示栈剖析数据,是因为Massif默认将分析结果写入**massif.out.**格式的文件,而非终端输出。

获取完整栈分析报告

  1. 程序运行结束后,当前目录会生成类似massif.out.18236的输出文件(文件名中的数字是进程ID)
  2. 使用ms_print工具解析该文件,执行命令:
ms_print massif.out.18236

该命令会输出包含栈大小变化趋势、峰值数值、峰值出现位置,以及对应代码行的详细报告。

优化分析精度的建议

  • 编译时添加-g参数生成调试信息,这样ms_print能直接显示栈操作对应的具体代码行:
gcc -g -o main main.c
  • 若需要可视化追踪栈调用层次与内存占用变化,可结合valgrind --tool=callgrind工具,配合kcachegrind图形界面查看更直观的栈内存分布。

内容的提问来源于stack exchange,提问作者Vincenzo Greco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:52:51