2

-fomit-frame-pointerが使用されている場合(さまざまな-O設定に対して自動)、バックトレースの実行には問題があります。コードがこのスイッチでコンパイルされていることをコンパイル時に判断する方法があるかどうか疑問に思っていますか?その場合、アドバイスが不十分な場合にバックトレースを防ぐために#ifndefを入れることができます。

この-fomit-frame-pointerスイッチがオンのときにマクロが設定されていますか?

ありがとう、

SetJmp

4

3 に答える 3

2

私はこれを試しました:

gcc -E -fomit-frame-pointer -Wp、-dM foo.c> fpo.out
gcc -E -Wp、-dM foo.c> no-fpo.out
diff no-fpo.out fpo.out

ここで、foo.cは単純な「HelloWorld」プログラムであり、結果は得られません。これは、-fomit-frame-pointer使用されたかどうかに関係なく、すべてのプリプロセッサマクロが同一であることを意味します。ですから、あなたの質問に対する答えは「いいえ」だと思います。

おそらく、あなたができる最善のことは、Makefile(またはビルドプロセスが使用するもの)を変更して、を使用するときに独自のマクロ(たとえば-DNO_FRAME_POINTERS、何か)を定義すること-fomit-frame-pointerです。

于 2009-09-12T18:47:20.503 に答える
1

チェックに関しては、実行時にebpレジスタ(アーキテクチャに合わせて調整)がスタックの最上位から数バイト下を指しているかどうかをチェックし、[ebp]に格納されているポインタに従うことが理にかなっている場合。

于 2009-09-12T19:24:48.307 に答える
1

コンパイル時には実行できませんが、実行時にプログラムが最適化されているかどうかを確認できます。

不揮発性変数をsetjmp/と混合するなど、オプティマイザーによって確実に変更されるコードを記述しlongjmpます。その変数の値によって、プログラムが最適化されているかどうかがわかります。

#include <setjmp.h>
#include <stdio.h>

int is_optimised(void) {
    int i = 1;
    jmp_buf jmp_loc;

    if (setjmp(jmp_loc)) {
        return i;  // optimiser changes it to "return 1"
    }

    i = 0;
    longjmp(jmp_loc, 1);

    return 0;
}

int main(int argc, char *argv[]) {
    printf("%soptimised\n", is_optimised() ? "" : "non-");

    return 0;
}

-OスイッチなしでGCCを使用してコンパイルした場合は「 non-optimised」と出力され、スイッチ-O1を使用した-O4場合は「」と出力されますoptimised

もちろん、(他のコンパイラを使用した場合の)マイレージは異なる場合があります。

于 2009-09-12T19:05:09.617 に答える