コアダンプとは
コアダンプとは、プログラムが異常終了した瞬間のメモリ内容を記録したファイルのことです。主にプログラムの
デバッグに用いられ、問題発生時の状況を詳細に把握するために利用されます。元々は、磁気コアメモリの内容を紙に印刷したものを指していましたが、現在では、特定の
プロセスのメモリイメージやレジスタ情報などをファイルに保存する形式が一般的です。
コアダンプの歴史
初期のコンピュータシステムでは、コアダンプはメモリの内容を紙に印刷したものでした。これは、8進数や16進数で表現され、時には機械語命令や
ASCII文字に翻訳された情報も含まれていました。その後、技術の進歩に伴い、コアダンプはファイルとして保存されるようになり、特定の
プロセスの
アドレス空間やレジスタ値なども記録されるようになりました。
コアダンプが生成される原因
コアダンプは、プログラマーがプログラムの
バグを特定するために不可欠なツールです。高級言語で記述されたプログラムはコンパイルされ機械語になりますが、実行時に不正なメモリアクセスなどのエラーが発生することがあります。このようなエラーが発生すると、コアダンプが生成されます。主な原因としては、バッファオーバーフロー、初期化されていない変数へのアクセス(Nullポインタアクセス)などが挙げられます。また、killコマンドやgcoreコマンドを使って手動でコアダンプを生成することも可能です。
コアダンプの利用方法
コアダンプは、様々な状況で
デバッグ作業を効率化する上で非常に役立ちます。初期のシステムでは、コアダンプを利用することで、高価なコンピュータ資源を占有せずにプログラムを
デバッグできました。また、タイムシェアリングや
バッチ処理システムでは、コアダンプを用いてOSのオフライン
デバッグが可能となり、システムを迅速に通常業務に戻すことができました。コアダンプは後からじっくり解析したり、他のコアダンプと比較検討したりすることも可能です。
組み込みシステムのように、
デバッグ機能を組み込むのが難しい環境でも、コアダンプを他のコンピュータで分析することができます。一部の
オペレーティングシステムでは、動作中の
プロセスを
デバッグする機能がなかったため、コアダンプが
デバッグの唯一の手段でした。また、
バグの発生条件が不明確で再現性が低い場合や、タイミングによって発生する
バグの解析にも、コアダンプは非常に有効です。
多くの
オペレーティングシステムでは、プログラム内の致命的なエラーが発生すると自動的にコアダンプが生成されます。コアダンプファイルの最大サイズは、`limit coredumpsize` コマンドで設定できます。プログラムの
デバッグを行うプログラマーは、コアダンプを有効化するために `unlimit coredumpsize` コマンドを知っておく必要があります。
コアダンプには、メモリの内容がそのまま記録されるため、
アセンブリ言語や
C言語などで起こりやすいポインタの不正な状態を確認するのに適しています。このような
バグは、ソースレベルの
デバッガでは詳細な情報を提供できない場合があります。
デバッガは、シンボルテーブルを使ってダンプを翻訳し、変数名や対応するソースコードを表示することが可能です。また、ダンプ解析専用のツールも存在します。
Unix系OSでは、コアダンプファイルは
GNU BinutilsのBFDライブラリを用いて読み込まれます。このライブラリは、メモリアドレスに対応するコアダンプ内のデータを提供するだけであり、変数やデータ構造に関する知識は持ちません。そのため、
デバッグを行う際には、シンボルテーブルやデータ構造などの情報を活用する必要があります。
さらに、コアダンプをある時点で保存しておき、後でその状態を復元するのに使用することもできます。高可用性システムでは、コアダンプファイルをプロセッサ間で転送することで、高可用性を実現することもあります。この手法は、起動にコストがかかるソフトウェア(
GNU Emacsや
Perlなど)や、プリコンパイルヘッダー技術によるコンパイル時間短縮にも利用されています。
コアダンプのセキュリティ上の注意点
コアダンプには、メモリの内容がそのまま記録されるため、セキュリティ上機密性の高い情報が含まれる可能性があります。そのため、信頼できない第三者にアクセスされないように注意が必要です。ユーザー
プロセスのコアダンプは、所有者以外がアクセスできないようにカーネルがアクセス権限を設定することが一般的です。また、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