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
On MS-Windows, the backtrace looks somewhat differently, for example:< MS-Windowsではバックトレースの外観は若干異なります。以下は例です:
Backtrace: 00007ff61166a12e 00007ff611538be1 00007ff611559601 00007ff6116ce84a 00007ff9b7977ff0 ...
したがってsed
を通じたフィルタリングであり、ソースコードの行番号を表示するコマンドは以下のようになります
addr2line -C -f -i -p -e bindir/emacs-binary < backtrace
ここでbacktraceはbacktraceのコピーを含むテキストファイル名、bindirはEmacs実行可能ファイルを含むディレクトリー名(MS-WindowsではEmacsを起動したディレクトリーにあるemacs_backtrace.txt)、emacs-binaryはEmacs実行可能ファイル(GNUおよびUnixシステムでは通常はemacs、MS-WindowsおよびMS-DOSではemacs.exe)です。-pオプションがない古いバージョンのaddr2line
では、このオプションを省略してください。
coreファイルをサポートするシステムでは、Emacsはオプションでコアダンプ(core dump)を生成します。コアダンプはクラッシュ前のプログラムの状態に関する多くのデータを含むファイルで、通常GDBのようなデバッガーにロードして調べられます。多くのプラットフォームでは、コアダンプはデフォルトで無効になっているので、(たとえばシェルのスタートアップスクリプトで)シェルコマンド‘ulimit -c unlimited’を実行して、明示的に有効にしなければなりません。