如何分析 C 程序的堆栈大小

问题描述 投票:0回答:1

我正在尝试优化一个程序。 该程序不使用堆。 我想分析堆栈的大小以查看:

  • 堆栈有多大?
  • 堆栈在哪里达到顶峰?
  • 堆栈大小的趋势是什么?
  • 当我达到堆栈的峰值时,或者一般来说,在堆栈大小趋势的任何点上,我在代码中的位置?

我已经用这种方式尝试了 valgrind 和 Massif:

valgrind --tool=massif --stacks=yes ./program

例如一个简单的 hello world

#include <stdio.h>

void main()
{

    int input;

    scanf("%d", &input);

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

编译它

gcc -o main main.c

使用 valgrind 运行它

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== 
c stack profiling
1个回答
0
投票

你可以尝试这样的事情:

#include <stdio.h>

// Get stack pointer.
static inline unsigned char *sp() {
    register unsigned char *r;
    asm volatile ("mov %0, sp" : "=r" (r));
    return r;
}

unsigned char *top;

void recur(int n) {
    if (n == 0)
        return;
    recur(n - 1);
    printf("n = %d, stack = %zd\n", n, top - sp());
}

int main(void) {
    top = sp();
    recur(10);
    return 0;
}

其中

sp()
在每个函数的最深处被调用,结果按照你喜欢的方式跟踪。

经过优化,打印:

n = 1, stack = 480
n = 2, stack = 432
n = 3, stack = 384
n = 4, stack = 336
n = 5, stack = 288
n = 6, stack = 240
n = 7, stack = 192
n = 8, stack = 144
n = 9, stack = 96
n = 10, stack = 48
© www.soinside.com 2019 - 2024. All rights reserved.