1

スタック サイズが割り当てられたサイズよりも大きいすべての関数を取得したいのですが、提案する簡単な方法はありますか?

.obj ファイルを取得して逆アセンブルし、出力ファイルを分析しますか?

4

2 に答える 2

1

組み込みコンピューティング以外では、特定の呼び出しよりも、無限再帰がスタック オーバーフローの原因となる可能性がはるかに高くなります。

そうは言っても、最初の概算では、ローカルに割り当てられた配列を探します。

void foo() {
    ...
    char buffer[1024] = "";
    ...
}

また、呼び出しを忘れないでください。ヒープに割り当てるのとalloca()同じ方法で、スタックに領域を動的に割り当てます。malloc()

于 2011-08-20T04:47:23.777 に答える
1

各関数のアセンブリ ダンプを確認できます。gcc では、-Sオプションを使用します。

function に興味があるとしましょうfoo。次に、gcc は関数名を にマングルします_foo。アセンブリを確認すると、関数の上部近くに、スタック ポインターを移動する命令が表示されます。たとえば、OSX では次のようなものがあります。

_foo:
    ...
    movq %rsp, %rbp
    ...
    subq $48, %rsp

その数$48がスタックサイズです。

または、同等のコマンドを使用nmして関数の開始アドレスを検索しndisasm、人間が読める形式のダンプを取得してから、スタック ポインターが移動する場所をスキャンすることもできます。

于 2011-08-20T04:25:07.540 に答える