質問に static-analysis のタグを付けましたが、これは static-analysis で解決するのが難しい問題です。スタックの使用量は、特に再帰または alloca を使用している場合、プログラムのランタイム プロファイルに依存します。これが組み込みプラットフォームであることを考えると、 psやtopなどを実行して、アプリケーションが使用しているスタックの量を確認することも難しいと思います。
興味深いアプローチは、現在のスタック フレームのアドレスを使用して、使用されているスタックの量を判断することです。これを行うには、関数の引数またはローカル変数のアドレスを取得します。メイン関数と、最も多くのスタックを使用していると思われる関数に対してこれを行います。違いは、アプリケーションが必要とするスタックの量を教えてくれます。以下に例を示します (通常の高から低へのスタックの成長を想定しています)。
char *stack_top, stack_bottom;
int
main(int argc, char *argv[])
{
stack_top = (char *)&argc;
// ...
printf("Stack usage: %d\n", stack_top - stack_bottom);
}
void
deeply_nested_function(void)
{
int a;
stack_bottom = (char *)&a;
// ...
}
コンパイラでカスタム関数のプロローグを指定できる場合 (多くの場合、グラフベースのプログラム プロファイリングを可能にするために指定します)、すべての関数がそのような測定コードを呼び出すように調整することもできます。次に、測定関数は次のようになります
void
stack_measurement_function(void)
{
int a;
stack_bottom = min(stack_bottom, (char *)&a);
// ...
}
これらのチャートを生成するために、私が説明したものと同様のアプローチを使用しました。