30

最近、GCC 4.8 のドキュメントが更新され、新しい最適化スイッチ-Og. これ

[..] 合理的なレベルのランタイム パフォーマンスを提供しながら、高速コンパイルと優れたデバッグ エクスペリエンスのニーズに対応します。開発の全体的な経験は、デフォルトの最適化レベル -O0 よりも優れているはずです。

このスイッチは暗示的ですか、それとも手動で-g追加する必要がありますか?CXXFLAGS

4

3 に答える 3

40

GCC 4.9.2 ソース コード (gcc/opts.c) を見る-Ogと、これは と同じです-O1が、一部のフラグが無効になっているため、デバッグ エクスペリエンスが低下する可能性があります。

/* in function default_options_optimization: */
    case OPT_Og:
      /* -Og selects optimization level 1.  */
      opts->x_optimize_size = 0;
      opts->x_optimize = 1;
      opts->x_optimize_fast = 0;
      opts->x_optimize_debug = 1;
      break;

数ステップ後、maybe_default_option一連のオプションとx_optimize_debugフラグを指定して関数が呼び出されます。でマークされたオプションはOPT_LEVELS_1_PLUS_NOT_DEBUG、使用時に有効にOPT_LEVELS_1_PLUS_SPEED_ONLYなりOPT_LEVELS_2_PLUS_SPEED_ONLYません-Og

したがって、これが「-O0よりも優れている必要がある」というステートメントの由来です。-Ogと の間に-O0あり-O1ます。-gこれは、オプションによって有効になるデバッグ情報の組み込みには影響しません。-gおそらく、さまざまなオプションにも興味があるでしょう。

  • オプションの-ggdbオーバーライド-g。つまり、の-ggdb後に設定-gすると、-gオプションは事実上無視されます。
  • オプション-gは と等しく-g2、省略-gは と同じ-g0です。
  • Option-g3は よりも大きなデバッグ セクションを生成し、それに対して-g2も同様です。-ggdb3-ggdb2
  • 最適化レベルを高くすると、コード セクションとデバッグ セクションが増加します。( -O0<< -O1< -Og< -O2) -O3
  • strip --strip-debugレベルに関係なく同じオブジェクトサイズになりました-g。これは、デバッグ セクションを決定する-O実際のコードに影響を与えるのはレベルのみであるという予想と一致していました。-g
  • strip --keep-debugサイズがレベルによって支配され-g、その後にレベルが続くオブジェクトになり-Oます。( so-g0 -O3は よりも小さい-g3 -O0)。

注: ここでは、コンパイル時間は考慮していません。よりアグレッシブな最適化レベルで増加する可能性があります。パス中に追加の詳細を追跡する必要があることを意味するだけなので、デバッグレベルが時間に与える影響は (最適化と比較して) わずかであると予想されます。

実際の動作をテストするために使用したコマンドを次に示します (の-ggdbX代わりに比較も行います-gX)。

for g in -g0 -g2 -g3;do
    for O in -O0 -O1 -O2 -O3 -Og; do
        flags="$g $O";
        gcc -fPIC -rdynamic -c -Wall -Wextra -Ilib ltunify.c -o obj/gL_"${flags// /_}_.o" $flags || break;
    done;
done
于 2014-11-22T10:25:36.270 に答える
23

簡単な回答-g: いいえ、手動で追加する必要があります。

長い答え:

ソースから直接難しい答えを見つけるのに苦労したので、ここで説明されている方法を使用して自分でテストすることにしました:プログラムがデバッグシンボルでコンパイルされたかどうかを確認する方法?

-O3フラグありとなしの実行可能ファイルを作成しました-g。予想どおり、使用してobjdump --syms <file> | grep debugも何も得られませんでした。

-g次に、最適化フラグの有無にかかわらず、実行可能ファイルをビルドしました。同じobjdumpコマンドで、次のような 6 つの結果が得られました。

0000000000000000 l d .debug_info 0000000000000000 .debug_info

最後に、-Ogフラグありとなしの実行可能ファイルをビルドしました-gobjdumpコマンドは何も生成しませんでした。これは、この場合、デバッグ シンボルが存在しないことを意味します。

GCC 自体から明示的なドキュメントを見つけることはできませんが、Gentoo Wiki (Marco Scannadinari が以前に述べたように)-Ogは、 -g.

于 2014-03-03T17:38:21.693 に答える
1

--version gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)fedora 29 ワークステーション x86_64 上の gcc のマニュアル。

バージョンは違いますが参考になれば幸いです。

プログラムをデバッグするためのオプション

...
  If you are not using some other optimization option, consider using -Og with -g.  With no -O option at
  all, some compiler passes that collect information useful for debugging do not run at all, so that -Og may
  result in a better debugging experience.
...

最適化を制御するオプション

...
  -Og Optimize debugging experience.  -Og enables optimizations that do not interfere with debugging. It
      should be the optimization level of choice for the standard edit-compile-debug cycle, offering a
      reasonable level of optimization while maintaining fast compilation and a good debugging experience.
...

したがって、-Og最適化オプションの 1 つです。他の最適化オプションを使用していない場合は、-g とともに -Og を使用することを検討してください。

サンプル:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int n;

    for (n=0; n<10; n++) {
       printf("Print Number: %d\n", n);
    }
    return 0;
}

コンパイル:

[user@localhost myctest]$ gcc sample.c -o sample
[user@localhost myctest]$ gcc sample.c -o sample.Og -Og
[user@localhost myctest]$ gcc sample.c -o sample.g -g
[user@localhost myctest]$ gcc sample.c -o sample.Og.g -Og -g

次に、コンパイルされたファイルのサイズを確認できます。

[user@localhost myctest]$ ls -l --human-readable sample*
-rwxrwxr-x. 1 user user 18K Aug 10 19:43 sample
-rw-rw-r--. 1 user user 162 Aug 10 19:43 sample.c
-rwxrwxr-x. 1 user user 21K Aug 10 19:43 sample.g
-rwxrwxr-x. 1 user user 18K Aug 10 19:43 sample.Og
-rwxrwxr-x. 1 user user 21K Aug 10 19:44 sample.Og.g

その後、readelf(GNU readelf バージョン 2.31.1-13.fc29) を使用して、これらのファイルのデバッグ情報を再確認できます。

[user@localhost myctest]$ readelf --debug-dump=aranges sample
[user@localhost myctest]$ readelf --debug-dump=aranges sample.g
Contents of the .debug_aranges section:

  Length:                   44
  Version:                  2
  Offset into .debug_info:  0x0
  Pointer Size:             8
  Segment Size:             0

    Address            Length
    0000000000401126 000000000000003d 
    0000000000000000 0000000000000000 

[user@localhost myctest]$ readelf --debug-dump=aranges sample.Og
[user@localhost myctest]$ readelf --debug-dump=aranges sample.Og.g
Contents of the .debug_aranges section:

  Length:                   44
  Version:                  2
  Offset into .debug_info:  0x0
  Pointer Size:             8
  Segment Size:             0

    Address            Length
    0000000000401126 0000000000000028 
    0000000000000000 0000000000000000 
 

オプションのみでコンパイルされたファイルにはデバッグ情報がないことがわかり-Ogます。のオプションでさらに詳しい情報を確認することもできますreadelf --debug-dump=。たとえばreadelf --debug-dump=aranges,info sample.g。とreadelf --headers sample.g | grep debug

参照man readelf:

--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=trace_info, =trace_abbrev,=trace_aranges,=gdb_index,=addr,=cu_index,=links,=follow-links]

gdb を使用して以下を確認できます。

[user@localhost myctest]$ gdb sample.Og
GNU gdb (GDB) Fedora 8.2-3.fc29
Copyright (C) 2018 Free Software Foundation, Inc.
...

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from sample.Og...(no debugging symbols found)...done.
(gdb) 

次に(no debugging symbols found)、ファイル sample.Og を取得します。

4.8.x

4.8.x ドキュメントでは、セクションDebugging-Options-Ogでは言及されておらず、セクションOptimize-Optionsでのみ紹介されています。

于 2021-08-10T12:02:01.623 に答える