g++ 4.3を使用してアプリケーションを構築しています。そのオプションを使用する代わりに、可能な最大最適化レベルを使用しており、-g
ビルド後にシンボルを削除しています。
私のアプリケーションとライブラリからシンボルを削除しなくても、コアファイルはまだ役に立ちますか? (アプリケーションがクラッシュしたときに生成されます。)
最大限の最適化でアプリケーションをコンパイルする場合、コアファイルは役に立ちますか? (オプションもなく、-g
ストリップ記号もありません。)
答え1
通常、コアファイルは、プロセスで使用されるメモリ全体とCPUレジスタ状態のダンプです。したがって、通常、コアファイルから取得できる情報は、競合が発生する前にデバッガをプロセスに接続して取得できる情報と同じです。
もし私がするならいいえ私のアプリケーションとライブラリからシンボルを削除しても、コアファイルはまだ役に立ちますか?
ウィキペディアページからコアダンプ:
「最新のUnixファミリーオペレーティングシステムでは、管理者とプログラマはGNU Binutilsバイナリファイル記述子ライブラリ(BFD)を使用してコアダンプファイルを読み取ることができます。[...]生データはコアダンプから来ます。ライブラリを使用するアプリケーションは、変数のアドレスを決定し、データ構造自体のレイアウトを決定する必要があります(たとえば、プログラムのシンボルテーブルを使用する)。
したがって、最初の質問に対する答えは次のようになります。いいえ、実行ファイルからシンボルが削除されると、コアダンプファイルはほとんど役に立ちません。
ただし、シンボルは一部のディスク領域を占有し、パフォーマンスに影響を与えません。最大最適化でコンパイルできます。そして
-g
同時に。
最大限の最適化でアプリケーションをコンパイルする場合、コアファイルは役に立ちますか?
コアファイルはアプリケーションのクラッシュ時にメモリとプロセッサの状態のダンプなので、最適化とデバッグに関する一般的な警告が適用されます。デバッガは情報(変数値や関数呼び出しなど)のみを検索します。関数内で)。スタックトレース)最適化されていない場合。