コアダンプは、プログラムのメモリフットプリントのダンプです。すべてがどこにあるかがわかっている場合は、それを使用できます。
実行可能ファイルを使用するのは、それがメモリ内の(論理アドレスに関して)どこにあるかを説明するためです。つまり、コアファイルです。
コマンドを使用すると、objdump
調査中の実行可能オブジェクトに関するメタデータがダンプされます。例としてa.outという名前の実行可能オブジェクトを使用します。
objdump -h a.out
ヘッダー情報のみをダンプします。たとえば、という名前のセクションが表示されます。.dataまたは.bssまたは.text(もっとたくさんあります)。これらは、カーネルローダーに、オブジェクト内のさまざまなセクションのある場所とプロセスアドレス空間のどこにセクションをロードする必要があるか、一部のセクション(.data .textなど)には何をロードするかを通知します。(.bssセクションにはファイル内のデータは含まれていませんが、初期化されていないデータ用にプロセスで予約するメモリの量を指し、ゼロで埋められています)。
実行可能オブジェクトファイルのレイアウトは、標準のELFに準拠しています。
objdump -x a.out
-すべてをダンプします
実行可能なオブジェクトがまだ(それが除去されていない-そのシンボルテーブルが含まれている場合はman strip
、あなたが使用-g
するデバッグ世代を生成するために、gcc
交流電源のコンパイルと仮定して)あなたは、変数/バッファを持っていた場合は、シンボル名により、例えばコアの内容を調べることができますソースコードでinputLineという名前を付けると、その名前を使用gdb
してコンテンツを確認できます。つまりgdb
、inputLineが開始するプログラム初期化データセグメントの開始からのオフセットとその変数の長さがわかります。
Article1、
Article 2、さらに重要な実行可能リンク形式(ELF)仕様についてさらに読むには。
以下の@mirabilosコメントの後に更新してください。
しかし、シンボルテーブルを次のように使用すると、
$ gdb --batch -s a.out -c core -q -ex "x buf1"
生産する
0x601060 <buf1>: 0x72617453
そして、シンボルテーブルを使用せずに直接アドレスを調べます、
$ gdb --batch -c core -q -ex "x 0x601060"
生産する
0x601060: 0x72617453
2番目のコマンドでシンボルテーブルを使用せずにメモリを直接調べました。
また、@ user580082の回答は説明にさらに追加され、賛成票を投じます。