[解決済み] デバッグオプション -g はバイナリ実行ファイルをどのように変更するのですか?
質問
C/C++のコードを書くとき、バイナリ実行ファイルをデバッグするために、コンパイラ/リンカでデバッグオプションを有効にする必要があります。 GCCの場合、そのオプションは-gです。 デバッグ・オプションが有効なとき、バイナリ実行ファイルにどのような影響を与えますか? デバッガを機能させるために、ファイルにどのような追加データが格納されているのでしょうか?
どのように解決するのですか。
-g は、実行ファイルにシンボルテーブル情報を保存するようコンパイラに指示します。 とりわけ、これは以下を含みます。
- シンボル名
- シンボルの型情報
- シンボルの元となったファイルと行番号
デバッガはこの情報を使って、シンボルに意味のある名前を出力したり、命令をソースの特定の行と関連付けたりします。
一部のコンパイラでは、-g を指定すると、特定の最適化が無効になります。たとえば、icc では、明示的に -O[123] を指定しない限り、-g を指定するとデフォルトの最適化レベルが -O0 に設定されます。 また、-O[123] を指定しても、スタック・トレースを防止する最適化は無効になります (例: スタック・フレームからフレーム・ポインタを取り除くなど)。 これはパフォーマンスにわずかな影響を与えるだけです)。
いくつかのコンパイラーでは、-g は、シンボルがどこから来たのか混乱させるような最適化 (命令の並べ替え、ループのアンローリング、インライン化など) を無効化します。 最適化でデバッグしたい場合、gcc で -g3 を使用すると、この一部を回避することができます。 マクロ、拡張、およびインライン化された可能性のある関数に関する追加のデバッグ情報が含まれます。これにより、デバッガやパフォーマンス・ツールが最適化されたコードを元のソースにマップすることができますが、これは最善の努力です。 一部の最適化では、コードを本当にこじらせてしまいます。
より詳細な情報は DWARF は、もともと ELF (Linux やその他の OS 用のバイナリ形式) と共に設計されたデバッグ用フォーマットです。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットを作るルールがない)
-
[解決済み] .ascizと.stringアセンブラディレクティブの違いは何ですか?
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] なぜGCCは、速度の代わりにサイズに最適化すると、15-20%速いコードを生成するのですか?
-
[解決済み】-Wl,-rpath -Wlがわかりません。
-
[解決済み] ビルドターゲットの外にgccのデバッグシンボルを生成する方法は?
-
[解決済み] デバッガとはどのようなものですか?
-
[解決済み] brew install gccは時間がかかりすぎる
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】警告:イニシャライザーの周りに中括弧がないことを修復する方法?
-
[解決済み] gcc エラー : `itoa' への未定義の参照
-
[解決済み] 自作のmakefileを作成する【エラー255】。
-
C++コンパイルエラー:型に名前がない
-
[解決済み] LD_LIBRARY_PATH と LIBRARY_PATH の比較
-
[解決済み] gcc/g++とcc1/cc1plusの違いは何ですか?
-
[解決済み] brew install gccは時間がかかりすぎる
-
[解決済み] デバッガとは何ですか、またデバッガはどのように問題の診断に役立ちますか?
-
[解決済み] 2つのGCCコンパイルされた.oオブジェクトファイルを3つ目の.oファイルに結合する。
-
[解決済み] gcc -s "と "strip "コマンドの違いは何ですか?