Next: , Previous: , Up: Lossage   [Contents][Index]


50.6 Emacsがクラッシュしたとき

Emacsはクラッシュを前提としていませんが、もしクラッシュした場合、exitする前にクラッシュレポート(crash report)を生成します。クラッシュレポートは標準エラーストリームにプリントされます。EmacsがGNUシステムまたはUnixシステムでグラフィカルなデスクトップから開始された場合、標準エラーストリームは一般的に~/.xsession-errorsのようなファイルにリダイレクトされるので、そこでクラッシュレポートを探すことができます。MS-Windowsでは、クラッシュレポートは標準エラーストリームに加え、Emacsプロセスのカレントとディレクトリーの、emacs_backtrace.txtという名前のファイルに書き込まれます。

クラッシュレポートのフォーマットは、プラットフォームに依存します。GNU Cライブラリーを使用するいくつかのプラットフォームでは、クラッシュレポートには、クラッシュ前の実行状態を説明するbacktraceが含まれ、これはクラッシュをデバッグする助けとなります。以下はGNUシステムの例です:

Fatal error 11: Segmentation fault
Backtrace:
emacs[0x5094e4]
emacs[0x4ed3e6]
emacs[0x4ed504]
/lib64/libpthread.so.0[0x375220efe0]
/lib64/libpthread.so.0(read+0xe)[0x375220e08e]
emacs[0x509af6]
emacs[0x5acc26]
…

数字‘11’ はクラッシュにたいするシステムのシグナル番号 — このケースではsegmentation fault — です。16進数字はプログラムのアドレスで、これによりデバッグツールを使用して、ソースコード行に関連付けることができます。たとえばGDBコマンド‘list *0x509af6’は、‘emacs[0x509af6]’エントリーにたいするソースコード行をプリントします。システムにaddr2lineユーティリティーがある場合、以下のシェルコマンドはソースコードの行番号とともに、backtraceを出力します:

sed -n 's/.*\[\(.*\)]$/\1/p' backtrace |
  addr2line -C -f -i -p -e bindir/emacs-binary

ここで、backtraceはbacktraceのコピーを含むテキストファイル名、bindirはEmacs実行可能ファイルを含むディレクトリー名、emacs-binaryはEmacs実行可能ファイル(GNUおよびUnixシステムでは通常はemacs、MS-WindowsおよびMS-DOSではemacs.exe)です。-pオプションがない古いバージョンのaddr2lineでは、このオプションを省略してください。

coreファイルをサポートするシステムでは、Emacsはオプションでコアダンプ(core dump)を生成します。コアダンプはクラッシュ前のプログラムの状態に関する多くのデータを含むファイルで、通常GDBのようなデバッガーにロードして調べられます。多くのプラットフォームでは、コアダンプはデフォルトで無効になっているので、(たとえばシェルのスタートアップスクリプトで)シェルコマンド‘ulimit -c unlimited’を実行して、明示的に有効にしなければなりません。