[解決済み] gcc -g :どうなるんだろう
質問
この質問は、面接で聞かれたものです。
デバッグ用のコアダンプファイルの作成方法を聞かれました。
そこで私は
-g
フラグを
gcc
することができます。
という質問を受けました。
-g
フラグがコンパイラに作用するのです。
私は、(おそらく間違った答えですが)コアファイルのすべてのシンボルを開き、デバッグに使用することができますと言いました。
具体的に何をするのか、どなたか教えてください。
どのように解決するのですか?
それはある意味正しいのですが、不完全なんです。
-g
は、コンパイラとリンカが実行ファイル自体にソースレベルのデバッグ/シンボル情報を生成して保持することを要求しています。
もし ...
- プログラムがクラッシュしてコアファイルを生成する(これは実際のコードに何らかの問題があることを示唆している)、または
-
OSの意図的なコマンドで強制的にコアにされた(例.
kill -SIGQUIT
ピッド )、または -
プログラムがコアをダンプする関数を呼び出した場合 (例.
abort
)
... - これらはいずれも、実際には
-g
- とすると、デバッガはその " の読み方を知っていることになります。
-g
というシンボル情報を実行ファイルから取得し、コアと相互参照します。 つまり、スタックフレームで変数や関数の適切な名前を確認し、行番号を取得し、実行ファイル内を移動しながらソースを見ることができるのです。
このデバッグ情報は、コアから始めた場合でも、実行ファイルだけから始めた場合でも、デバッグのたびに役に立ちます。 また、次のようなコマンドでより良い出力を得るのにも役立ちます。
pstack
.
あなたの環境では、コアを生成するかどうかを制御するための他の設定があるかもしれないことに注意してください(コアは大きくなる可能性があり、いつ削除できるかを知る一般的な方法はないので、常に欲しいわけではありません)。 例えば、UNIX/LINUX シェルでは、しばしば
ulimit -c
.
また、以下の記事もご覧ください。 DWARF ウィキペディア - は、実行ファイル/ライブラリオブジェクトに埋め込まれたデバッグ/シンボル情報をエンコードするための一般的なデバッグ情報フォーマットです(例:UNIXやLinux)。
コメントでVictorさんのリクエストに応えてUPDATE...
シンボル情報 はソースコードから識別子をリストアップします。 名称の乱れ プロセスメモリにロードされる(仮想)メモリアドレス/オフセット、タイプ(データかコードかなど)です。) 例えば...
$ cat ok.cc
int g_my_num;
namespace NS { int ns_my_num = 2; }
int f() { return g_my_num + NS::ns_my_num; }
int main() { return f(); }
$ g++ -g ok.cc -o ok # compile ok executable with symbol info
$ nm ok # show mangled identifiers
00000000004017c8 d _DYNAMIC
0000000000401960 d _GLOBAL_OFFSET_TABLE_
0000000000400478 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
000000000040037c T _Z1fv # this is f()
0000000000401798 D _ZN2NS9ns_my_numE # this is NS::ns_my_num
00000000004017a8 d __CTOR_END__
00000000004017a0 d __CTOR_LIST__
00000000004017b8 d __DTOR_END__
00000000004017b0 d __DTOR_LIST__
0000000000400540 r __FRAME_END__
00000000004017c0 d __JCR_END__
00000000004017c0 d __JCR_LIST__
00000000004017c8 d __TMC_END__
00000000004017c8 d __TMC_LIST__
0000000000401980 A __bss_start
0000000000401788 D __data_start
0000000000400440 t __do_global_ctors_aux
00000000004002e0 t __do_global_dtors_aux
0000000000401790 d __dso_handle
0000000000000000 a __fini_array_end
0000000000000000 a __fini_array_start
w __gmon_start__
0000000000000000 a __init_array_end
0000000000000000 a __init_array_start
00000000004003a0 T __libc_csu_fini
00000000004003b0 T __libc_csu_init
U __libc_start_main
0000000000000000 a __preinit_array_end
0000000000000000 a __preinit_array_start
0000000000401980 A _edata
0000000000401994 A _end
0000000000400494 T _fini
000000000040047c T _init
0000000000400220 T _start
000000000040024c t call_gmon_start
0000000000401980 b completed.6118
0000000000401788 W data_start
0000000000400270 t deregister_tm_clones
0000000000401988 b dtor_idx.6120
0000000000401994 A end
0000000000400350 t frame_dummy
0000000000401990 B g_my_num # our global g_my_num
0000000000400390 T main # the int main() function
00000000004002a0 t register_tm_clones
$ nm ok | c++filt # c++filt "unmangles" identifiers...
00000000004017c8 d _DYNAMIC
0000000000401960 d _GLOBAL_OFFSET_TABLE_
0000000000400478 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
000000000040037c T f()
0000000000401798 D NS::ns_my_num
00000000004017a8 d __CTOR_END__
00000000004017a0 d __CTOR_LIST__
00000000004017b8 d __DTOR_END__
00000000004017b0 d __DTOR_LIST__
0000000000400540 r __FRAME_END__
00000000004017c0 d __JCR_END__
00000000004017c0 d __JCR_LIST__
00000000004017c8 d __TMC_END__
00000000004017c8 d __TMC_LIST__
0000000000401980 A __bss_start
0000000000401788 D __data_start
0000000000400440 t __do_global_ctors_aux
00000000004002e0 t __do_global_dtors_aux
0000000000401790 d __dso_handle
0000000000000000 a __fini_array_end
0000000000000000 a __fini_array_start
w __gmon_start__
0000000000000000 a __init_array_end
0000000000000000 a __init_array_start
00000000004003a0 T __libc_csu_fini
00000000004003b0 T __libc_csu_init
U __libc_start_main
0000000000000000 a __preinit_array_end
0000000000000000 a __preinit_array_start
0000000000401980 A _edata
0000000000401994 A _end
0000000000400494 T _fini
000000000040047c T _init
0000000000400220 T _start
000000000040024c t call_gmon_start
0000000000401980 b completed.6118
0000000000401788 W data_start
0000000000400270 t deregister_tm_clones
0000000000401988 b dtor_idx.6120
0000000000401994 A end
0000000000400350 t frame_dummy
0000000000401990 B g_my_num
0000000000400390 T main
00000000004002a0 t register_tm_clones
注意事項
-
当社の機能
f()
とmain()
はタイプT
(これは "TEXT" の略で、実際のテキストやその他のデータ、実行コードに関わらず、読み取り専用の非ゼロのメモリコンテンツに使用されます), -
g_my_num
はB
は暗黙のうちにゼロにされたメモリを持つグローバルであるのに対し -
NS::ns_my_num
はD
を明示的に指定する必要があるためです。2
を使用して、そのメモリを占有します。
は、その
の man/info ページをご覧ください。
nm
は、これらのことをさらに文書化したものです...。
関連
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】デバッグアサーションに失敗しました