コアダンプ

コアダンプとは



コアダンプとは、プログラムが異常終了した瞬間のメモリ内容を記録したファイルのことです。主にプログラムのデバッグに用いられ、問題発生時の状況を詳細に把握するために利用されます。元々は、磁気コアメモリの内容を紙に印刷したものを指していましたが、現在では、特定のプロセスのメモリイメージやレジスタ情報などをファイルに保存する形式が一般的です。

コアダンプの歴史



初期のコンピュータシステムでは、コアダンプはメモリの内容を紙に印刷したものでした。これは、8進数や16進数で表現され、時には機械語命令やASCII文字に翻訳された情報も含まれていました。その後、技術の進歩に伴い、コアダンプはファイルとして保存されるようになり、特定のプロセスアドレス空間やレジスタ値なども記録されるようになりました。

コアダンプが生成される原因



コアダンプは、プログラマーがプログラムのバグを特定するために不可欠なツールです。高級言語で記述されたプログラムはコンパイルされ機械語になりますが、実行時に不正なメモリアクセスなどのエラーが発生することがあります。このようなエラーが発生すると、コアダンプが生成されます。主な原因としては、バッファオーバーフロー、初期化されていない変数へのアクセス(Nullポインタアクセス)などが挙げられます。また、killコマンドやgcoreコマンドを使って手動でコアダンプを生成することも可能です。

コアダンプの利用方法



コアダンプは、様々な状況でデバッグ作業を効率化する上で非常に役立ちます。初期のシステムでは、コアダンプを利用することで、高価なコンピュータ資源を占有せずにプログラムをデバッグできました。また、タイムシェアリングやバッチ処理システムでは、コアダンプを用いてOSのオフラインデバッグが可能となり、システムを迅速に通常業務に戻すことができました。コアダンプは後からじっくり解析したり、他のコアダンプと比較検討したりすることも可能です。

組み込みシステムのように、デバッグ機能を組み込むのが難しい環境でも、コアダンプを他のコンピュータで分析することができます。一部のオペレーティングシステムでは、動作中のプロセスデバッグする機能がなかったため、コアダンプがデバッグの唯一の手段でした。また、バグの発生条件が不明確で再現性が低い場合や、タイミングによって発生するバグの解析にも、コアダンプは非常に有効です。

多くのオペレーティングシステムでは、プログラム内の致命的なエラーが発生すると自動的にコアダンプが生成されます。コアダンプファイルの最大サイズは、`limit coredumpsize` コマンドで設定できます。プログラムのデバッグを行うプログラマーは、コアダンプを有効化するために `unlimit coredumpsize` コマンドを知っておく必要があります。

コアダンプには、メモリの内容がそのまま記録されるため、アセンブリ言語C言語などで起こりやすいポインタの不正な状態を確認するのに適しています。このようなバグは、ソースレベルのデバッガでは詳細な情報を提供できない場合があります。デバッガは、シンボルテーブルを使ってダンプを翻訳し、変数名や対応するソースコードを表示することが可能です。また、ダンプ解析専用のツールも存在します。

Unix系OSでは、コアダンプファイルはGNU BinutilsのBFDライブラリを用いて読み込まれます。このライブラリは、メモリアドレスに対応するコアダンプ内のデータを提供するだけであり、変数やデータ構造に関する知識は持ちません。そのため、デバッグを行う際には、シンボルテーブルやデータ構造などの情報を活用する必要があります。

さらに、コアダンプをある時点で保存しておき、後でその状態を復元するのに使用することもできます。高可用性システムでは、コアダンプファイルをプロセッサ間で転送することで、高可用性を実現することもあります。この手法は、起動にコストがかかるソフトウェア(GNU EmacsPerlなど)や、プリコンパイルヘッダー技術によるコンパイル時間短縮にも利用されています。

コアダンプのセキュリティ上の注意点



コアダンプには、メモリの内容がそのまま記録されるため、セキュリティ上機密性の高い情報が含まれる可能性があります。そのため、信頼できない第三者にアクセスされないように注意が必要です。ユーザープロセスのコアダンプは、所有者以外がアクセスできないようにカーネルがアクセス権限を設定することが一般的です。また、setuid/setgidビットが設定されたプロセスでは、実UID/GIDユーザーからの覗き見を防ぐために、コアダンプを生成しないのが一般的です。カーネルのコアダンプには、OSを利用している全てのユーザーの情報が含まれるため、所有者は通常スーパーユーザーに限定されます。コアダンプを外部に持ち出す場合は、暗号化等のセキュリティ対策を講じることが推奨されます。

コアダンプファイルの形式



古いオペレーティングシステムでは、プロセスアドレス空間は連続しており、コアダンプファイルも単純にアドレス順にバイトが並んでいるだけでした。しかし、最近のOSでは、プロセスアドレス空間には使用していない部分が存在するため、ファイル形式も複雑化しています。また、ダンプ採取時のプログラムの状態などの情報も格納されています。

Unix系システムでは、コアダンプはメモリイメージの再現を容易にするため、実行ファイルファイルフォーマットを使用しています。古いUNIXでは、a.outフォーマットが用いられていましたが、ELF形式の普及に伴い、コアダンプにもELFが採用されるようになりました。macOSではMach-O形式が使用されています。これらの形式では、実行ファイルのロード処理とは逆の処理を実行することでメモリイメージをファイルに書き出し、コンテキストや仮想記憶の状態など、デバッグに必要な情報を付加しています。

ジャーゴン



日本語では、異常終了したプロセスがコアダンプを出力することを、俗に「コアを吐く」と言います。この言葉が転じて、嘔吐の意味で「コアダンプする」というスラングも存在します。

関連項目




参考文献



  • - Mike Loukides 著、砂原秀樹 監訳『UNIXシステムチューニング』アスキー出版局、1991年7月21日。ISBN 4-7561-0077-5。

外部リンク



- Solaris
- HP-UX
- AIX
- NetBSD
- FreeBSD
- OpenBSD
- macOS

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。